该文章适合对已经对 spring-security 3 有一定了解的同鞋。第一次发文欢迎各位多提意见 。
本文使用的spring-security 版本为 3.0.5 。就 jquery 版本为 1.6
在网上搜索了很多解决该问题的方法,总体思路都是通过服务端生成错误码,然后前端扩展ajax的方法 统一处理会话超时的问题。闲话不多说直接上代码:
首先是修改配置文件:
<http auto-config="true" <span style="color:#FF0000;"> entry-point-ref="smartLoginUrlAuthenticationEntryPoint"</span> >
扩展添加一个拦截器 继承 LoginUrlAuthenticationEntryPoint 注意2.0 版本是AuthenticationProcessingFilterEntryPoint 类,但是在3.0中已经过期了
所以直接继承它的父类
<span style="color:#FF0000;"> <!--<logout logout-success-url="/login.jsp" />--> </span>注释跳转配置 ,改用拦截器
<!-- 添加拦截器,session会话 超时拦截 -->
<beans:bean id="smartLoginUrlAuthenticationEntryPoint"
class="com.smart.sys.core.security.SmartLoginUrlAuthenticationEntryPoint">
<beans:property name="loginFormUrl" value="/login.jsp"/>
服务端代码处理 :
public class SmartLoginUrlAuthenticationEntryPoint extends
LoginUrlAuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest)request;
if ("XMLHttpRequest".equals(httpRequest.getHeader("X-Requested-With"))){ //当请求为ajax请求的时候进入判断处理
response.setCharacterEncoding("UTF-8");
response.addHeader("Error-Json", "{code:302,msg:'session tiemout !!',script:''}"); // 将错误放在header中
response.setStatus(300); // 定义300错误
} else{
super.commence(request, response, authException);
}
}
}
前端jquery ajax方法扩展 , jquery中的 get post load 方法 都是扩展的ajax方法,所以改这里就通用了 :(记得引用 jquery类库 )
(function($){
var ajax=$.ajax;
$.ajax=function(s){
var old=s.error;
var errHeader=s.errorHeader||"Error-Json";
s.error=function(xhr,status,err){
var errMsg = xhr.getResponseHeader(errHeader) ;
alert(errMsg);
}
ajax(s);
}
})(jQuery);
response.setStatus(300); // status 定义非200的错误 就会进入该方法处理 ,
在方法中我们可以添加重定向,也可以弹出DIV让客户重新登录!
参考文章 :
http://dean-liu.iteye.com/blog/1937860 spring-security 2 的方式实现的 ,不过js调试不怎么好使,可能我的jquery版本比较新