springboot整合shiro实现session过期后自动跳转登录页面:
登录系统后在session失效后再进行点击系统页面时自动跳转到登录页面
1.后端代码实现:
在springboot整合shiro实现登录验证授权基础代码上进行修改。
添加验证session失效重新跳转登录页面过滤器:
public class LoginFilter extends FormAuthenticationFilter {
private static final String[] filter = { "/css", ,"/img", "/icons","/html", "/js"};
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest hsRequest = (HttpServletRequest) request;
HttpServletResponse hsResponse = (HttpServletResponse) response;
String url = hsRequest.getRequestURI();
// 不需要过滤的请求地址以及文件
for (String str : filter) {
if (url.contains(str) || url.equalsIgnoreCase("/")){
return true;
}
}
//这里是获取用户登录信息
Subject subject = getSubject(request, response);
// 如果没有获取到用户信息,将退出到登陆界面
if (null == subject.getPrincipal()) {
boolean isAjaxRequest = false;
if(!StringUtils.isBlank(hsRequest.getHeader("x-requested-with")) && hsRequest.getHeader("x-requested-with").equals("XMLHttpRequest")){
isAjaxRequest = true;
}
// 如果是Ajax返回指定数据
if (isAjaxRequest) {
//可以通过code403判断是否重定向,也可以自定义一个属性指定是session超时的重定向
hsResponse.setHeader("sessionstatus", "TIMEOUT"); //返回特定数据(头部信息)
hsResponse.setHeader("content_path", "/account/login"); //返回特定数据(首页登陆地址)
hsResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); //403禁止
return false;
} else { // 不是Ajax进行重定向处理
hsResponse.sendRedirect("/account/login"); //重定向到登陆界面
return false;
}
}
return true;
}
}
在shiroConfig类中添加过滤器验证:
//Filter工厂,设置对应的过滤条件和跳转条件
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String, String> map = new HashMap<>();
//登出
map.put("/logout", "logout");
//登录
map.put("/loginSubmit", "anon");
//静态文件包
map.put("/res/**", "anon");
// 添加自己的过滤器并且取名为loginFilter
Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
filterMap.put("loginFilter", new LoginFilter());
shiroFilterFactoryBean.setFilters(filterMap);
//过滤链定义,从上向下顺序执行,一般将/**放在最为下边
filterChainDefinitionMap.put("/**", "loginFilter");
//登录
shiroFilterFactoryBean.setLoginUrl("/login");
//首页
shiroFilterFactoryBean.setSuccessUrl("/index");
//错误页面,认证不通过跳转
shiroFilterFactoryBean.setUnauthorizedUrl("/error");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
}
//配置session超时时间
@Bean
public DefaultWebSessionManager getDefaultWebSessionManager() {
DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
// 会话过期时间,单位:毫秒(在无操作时开始计时),设置30分钟
defaultWebSessionManager.setGlobalSessionTimeout(30* 1000 * 60);
defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
defaultWebSessionManager.setSessionIdCookieEnabled(true);
return defaultWebSessionManager;
}
这样再session失效后,再在系统点击任一个页面操作,都会经过过滤器验证,进行跳转登录页面。
2.前端代码实现:
创建一个common.js,覆盖ajax请求。在每个html页面都引入这个js。这样一来在session失效后再进行点击ajax提交时就不会再进行操作,会自动跳到登录页面。
//设置session超时跳转页面start
if(typeof jQuery != 'undefined') {
//重写ajax
$.ajaxSetup( {
//设置ajax请求结束后的执行动作
complete :
function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,sessionstatus
var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
if (sessionstatus == "TIMEOUT") {
var win = window;
while (win != win.top) {
win = win.top;
}
win.location.href = XMLHttpRequest.getResponseHeader("content_path");
}
}
});
}
// 如果使用了layui框架,也必须要重写layui的ajax
if(typeof layui != 'undefined') {
$.ajaxSetup({
complete: function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,sessionstatus
var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
if (sessionstatus == "TIMEOUT") {
var win = window;
while (win != win.top) {
win = win.top;
}
win.location.href = XMLHttpRequest.getResponseHeader("content_path");
} else {
if (textStatus == 'timeout') {
$.modal.alertWarning("服务器超时,请稍后再试!");
$.modal.enable();
$.modal.closeLoading();
} else if (textStatus == "parsererror" || textStatus == "error") {
$.modal.alertWarning("服务器错误,请联系管理员!");
$.modal.enable();
$.modal.closeLoading();
}
}
}
});
}
//设置session超时跳转页面end