springMVC session过期跳转到登录界面

1、非ajax的传统型跳转和ajax请求数据跳转

2、使用springMVC拦截器拦截请求,判断session是否过期

3、使用ajaxSetup 全局判断session请求是否过期。

        这种方式不是最好的方式,貌似有三种方式处理ajax重定向的问题,修改jquery源码、设置response头、或者每次ajax增加判断。我觉得修改jquery源码不好,每次判断又要改大量的前端代码,累死-_-||!!,所有我觉得最小程度修改前端代码是最好的选择。所以选择了设置response头。

     部分拦截器代码:

实现HandlerInterceptor接口,重写prehandle方法

  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,   
            Object handler) throws SessionTimeoutException, IOException {  
        String requestUrl = request.getRequestURI();    //获取请求的URL
        for(String url : allowUrls) {   //判断请求URL是否属于请求白名单
            if(requestUrl.endsWith(url)||requestUrl.indexOf(url)>=0) {  
                return true;  
            }  
        }  
        String session = String.valueOf(WebUtils.getSessionAttribute(request, "userId")); 
        String session1 = String.valueOf(WebUtils.getSessionAttribute(request, "zmccUser")); 
        if("null".equals(session)  || "null".equals(session1)) {   //判断session是否过期,如果是null则session过期
        	if(request.getHeader("x-requested-with")!=null){  // 非ajax请求比 ajax请求少一个x-requested-with属性,所以有x-requested-with属性则为ajax请求
        		response.setHeader("sessionstatus", "timeout");  //设置response头,前台依此来判断是否session过期
        		return false;
        	}else{
        		throw new SessionTimeoutException();  //非ajax请求,在我的项目中就是 返回ModelAndView,直接重定向就可以了,抛出SessionTimeoutException自定义异常,注意这是我自己定义的异常
        	}
        	
        	
        } else {  
            return true;  
        }  
    }  

配置springMVC的XML

  <mvc:interceptors>  
    <mvc:interceptor>  
        <mvc:mapping path="/**/*.do" />  
        <bean class="com.uniware.util.SessionTimeoutInterceptor" >  
            <property name="allowUrls">  
                <list>   <!-- 这些list是可以访问的白名单,不需要验证session  -->
                  <value>/login</value>  
                  <value>LoginController</value>
                </list>  
            </property>  
        </bean>  
    </mvc:interceptor>  
</mvc:interceptors>  
<!-- 处理自定义异常,直接跳转,当然你也可以自己实现这个AbstractHandlerExceptionResolver  -->
    <bean id="handlerExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >  
    <property name="exceptionMappings">  
        <props>  
            <prop key="com.uniware.util.SessionTimeoutException">redirect:/login.jsp</prop>  
        </props>  
    </property>  
</bean>  
/** * 设置未来(全局)的AJAX请求默认选项
 * 主要设置了AJAX请求遇到Session过期的情况
 */
$.ajaxSetup({
  type: 'POST',
  complete: function(xhr,status) {
    var sessionStatus = xhr.getResponseHeader('sessionstatus');
    if(sessionStatus == 'timeout') {
      window.top.location.href = window.top.location;  
    }
  }
});

最后你需要把上面的这段jquery代码放到每个请求前,我的项目有一个公共的工具js,我把这段贴在上面就可以了,这样前端我就加了这一项,但是如果你的每个jsp引入的文件都不一样,没有公共的js。那你就把他贴在jquery.js这种代码里好了,当然最好别这样做。

如果上面的代码或者思路有问题,请您指导。谢谢



  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值