问题描述:
在前后端完全分离下架构下,大部分数据请求都是通过Ajax异步获取的,如果session过期,拦截Ajax请求,跳转到登录页面(重定向,转发在Ajax请求下,是不可用的)
解决方案:
- 后台代码:
在过滤器或者拦截器中,拦截不符合要求的session请求
String type = request.getHeader("X-Requested-With");// XMLHttpRequest HttpServletRequest -> request
if ("XMLHttpRequest".equals(type)) {
//是ajax请求
// 异步请求下的重定向
response.addHeader("FLAG", "-1");
response.setHeader("SESSIONSTATUS", "TIMEOUT");
response.setHeader("CONTEXTPATH", php_Address);//重定向目标地址
response.setStatus(1000);
} else {
//非ajax请求,直接使用重定向
response.sendRedirect(php_Address);
}
- 修改ajax请求后的结束动作
对jQuery文件添加如下函数
$.ajaxSetup({
//设置ajax请求结束后的执行动作
complete: function (XMLHttpRequest, textStatus) {
var url = XMLHttpRequest.getResponseHeader("CONTEXTPATH");
var flag = XMLHttpRequest.getResponseHeader("FLAG");
if (flag != "" && flag == "-1") {/* console.log(url);*/
window.location.href = url;
}/* console.log(flag);console.log("1231");*/
}
});