务端会判断是否存在Session、而用户请求服务端常用异步请求方法(Ajax),这时Session过期,将无法使当前页面跳转到登录页面。
具体思路:在当前页面document中加一个ajax请求拦截的ajaxError事件,服务端判断session是否过期,如果过期返回一个错误代码如401,然后ajaxError拦截错误判断是服务端的401错误,则将跳转到登录页面。
服务端判断Session失效
服务端一般是拦截器判断Session是否失效、存在,判断用户请求是否是异步请求,异步请求Session失效 设置401返回码,
resp.sendError(401),如果不是异步则直接跳转到登录页面
publicclass SessionInterceptor implementsHandlerInterceptor {
@Override
publicvoid afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throwsException {
}
@Override
publicvoid postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throwsException {
}
@Override
publicboolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throwsException {
SysUser user = SysUserUtils.getUser();
if (user.getSysUserid() != null) {
returntrue;
}
//session 失效处理
String requestType = request.getHeader("X-Requested-With");
if(StringUtils.isNotEmpty(requestType)) {
response.sendError(401);//Session失效返回码,错误Msg是“Unauthorized”
return false;
}
returntrue;
}
}
AjaxError拦截错误信息
服务端401的代码对应的errorMsg是“Unauthorized”,ajaxError要注册到documnet中,这样对于该页面所有的ajax请求进行error拦截
$(document).ajaxError(function(e, jqXHR, options, errorMsg){
//no login
if(errorMsg == "Unauthorized") {
top.location = "${ctx}";
alert('\u672A\u767B\u5F55\u6216\u767B\u5F55\u8D85\u65F6\u3002\u8BF7\u91CD\u65B0\u767B\u5F55\uFF0C\u8C22\u8C22\uFF01');
}
});