最近在开发一个政务方面的项目,系统框架用到了spring security,结果出现了一个问题:就是session过期后页面跳转至登录页面的问题;
这里要分两种情况了;
第一种:普通的请求,如form表单提交,重定向等
spring-security.xml配置如下:
<session-management invalid-session-url="http://172.31.60.117:8088/mslogin/view/login.jsp" session-fixation-protection="newSession" > <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> </session-management> -
web.xml配置如下:
<listener> <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> </listener>
于是就可以监听到session后期后普通请求的拦截,跳转至登录页面。结果后期测试发现ajax请求无法拦截至登录页面,这时候的现象为ajax请求发出后无法请求到数据,但是页面又不能跳转,于是代码改为下面这种,既可以支持普通请求拦截,又可以支持ajax请求拦截;
spring-security.xml 配置如下
<session-management invalid-session-url="/public/invalidate" session-fixation-protection="newSession" > <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> </session-management>
这里/public/invalidate为Controller请求路径:创建Controller
package com.jointem.ngcms.controller; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * @Title: InvalidateSession * @Description: * @Author: bql * @Date: 2016年4月20日 * @Version: v1.0.0 * @Copyright: 2016 www.jointem.com Inc. All rights reserved. * @Update: 1. Create File */ @Controller public class InvalidateSession { /** * This url gets invoked when spring security invalidates session (ie timeout). * Specific content indicates ui layer that session has been invalidated and page should be redirected to logout. */ @RequestMapping(value = "/public/invalidate") @ResponseBody public String invalidateSession(HttpServletRequest reqeust,HttpServletResponse response) { String ajaxHeader = reqeust.getHeader("X-Requested-With"); boolean isAjax = "XMLHttpRequest".equals(ajaxHeader); if (isAjax) { return "invalidSession"; } else { try { response.sendRedirect("http://172.31.60.117:8088/mslogin/view/login.jsp"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return ""; } }
注意这里的几行代码为判断是否是ajax请求。
String ajaxHeader = reqeust.getHeader("X-Requested-With"); boolean isAjax = "XMLHttpRequest".equals(ajaxHeader);
如果是ajax请求,则返回invalidSession字符串,在前端js中添加如下代码就可以监听到后端的返回值
//全局的ajax访问,处理ajax清求时sesion超时 $.ajaxSetup({ complete: function(xhr, status) { if (xhr.responseText == 'invalidSession') { window.location = "http://172.31.60.117:8088/mslogin/view/login.jsp"; } } });
$.ajaxSetup为全局监听ajax请求,当后端返回值为invalidSession就可以跳转至自己需要的页面了。
在google 上搜了好半天,到最后也没解决掉问题,于是就自己改造为以上提供的代码,希望能帮助到遇到和我同样问题的小伙伴。