最近写项目碰到一个比较棘手的问题,就是当用户session过期时,访问html页面,浏览器会加载缓存里的html页面,导致没有被过滤器拦截,而里面的ajax请求却被过滤器拦截了,导致页面什么都没有显示。
在网上找了一些解决方案,感觉都比较复杂,于是自己想了一个解决方案,也拿出来给大家参考一下。
在过滤器里判断是否为ajax请求,ajax请求的请求头里有ajax特有的参数X-Requested-With:XMLHttpRequest
,如果是ajax请求,则响应一个用于判断用户登录是否过期的json数据。
过滤器:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null) { //如果用户不存在
String ajaxHeader = request.getHeader("X-Requested-With"); //获取ajax参数值
if("XMLHttpRequest".equals(ajaxHeader)) { //如果是ajax请求
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter out = response.getWriter();
out.write("{\"status\":401,\"msg\":\"您的登录已过期\"}"); //json数据
out.flush();
out.close();
}else {
response.sendRedirect("login.html");
}
}else {
filterChain.doFilter(servletRequest,servletResponse);
}
}
ajax的回调函数:
function (data) {
if(data.status == 200){
...
}else if(data.status == 401) { //登录过期,跳转到登录界面
window.location.href="login.html";
}else{
...
}
}