sping-mvc ajax访问 session超时 添加拦截

学识尚浅,若有需更正地方,请见谅并留言,谢谢!


我们先了解一下一些必要的信息。ajax 请求和普通的 http 请求是不一样的,Ajax请求是XMLHTTPRequest对象发起的,而http请求是浏览器发起的。

二者不同地方体现在HTTP请求的头信息中。

AJAX请求头中带有X-Requested-With信息,其值为XMLHttpRequest。而普通请求是没有的。


spring-mvc.xml 配置文件设置

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 配置拦截器,拦截请求(除了登录ajax请求外拦截全部ajax请求) -->  
  2.     <mvc:interceptors >  
  3.         <mvc:interceptor>  
  4.             <mvc:mapping path="/**"/>  
  5.             <mvc:exclude-mapping path="/admin/login/**"/>   
  6.             <bean class="com.wxc.paycoss.filter.AjaxCheckSession"/>  
  7.         </mvc:interceptor>  
  8.     </mvc:interceptors></span>  

说明:其中<bean> 中的 class 是对应包下的拦截器路径


下面是拦截器  AjaxCheckSession.Java  (这个类自由命名)


[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.wxc.paycoss.filter;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8. import org.springframework.web.servlet.ModelAndView;  
  9. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  10. import org.springframework.web.util.UrlPathHelper;  
  11.   
  12. import com.cvicse.paycoss.base.Const;  
  13. import com.cvicse.paycoss.domain.Oper;  
  14.   
  15.   
  16. public class AjaxCheckSession  extends HandlerInterceptorAdapter{  
  17.     private final Logger logger = LoggerFactory.getLogger(PaycossContextListener.class);  
  18.      // URL辅助工具类  
  19.     private UrlPathHelper urlPathHelper = new UrlPathHelper();  
  20.   
  21.     @Override  
  22.     public void afterCompletion(HttpServletRequest request,  
  23.             HttpServletResponse response, Object handler, Exception ex)  
  24.             throws Exception {  
  25.         // TODO Auto-generated method stub  
  26.         super.afterCompletion(request, response, handler, ex);  
  27.     }  
  28.   
  29.     @Override  
  30.     public void afterConcurrentHandlingStarted(HttpServletRequest request,  
  31.             HttpServletResponse response, Object handler) throws Exception {  
  32.         // TODO Auto-generated method stub  
  33.         super.afterConcurrentHandlingStarted(request, response, handler);  
  34.     }  
  35.   
  36.     @Override  
  37.     public void postHandle(HttpServletRequest request,  
  38.             HttpServletResponse response, Object handler,  
  39.             ModelAndView modelAndView) throws Exception {  
  40.         // TODO Auto-generated method stub  
  41.         super.postHandle(request, response, handler, modelAndView);  
  42.     }  
  43.   
  44.     @Override  
  45.     public boolean preHandle(HttpServletRequest request,  
  46.             HttpServletResponse response, Object handler) throws Exception {  
  47.           
  48.           
  49.         Oper oper = (Oper) request.getSession().getAttribute(Const.SESSION_LOGIN_ADMIN_USER);  
  50.           
  51.         String requestCTX = urlPathHelper.getContextPath(request);  
  52.         System.out.println(requestCTX);  
  53.         String requestUri = request.getRequestURI(); //请求完整路径,可用于登陆后跳转  
  54.         String contextPath = request.getContextPath();  //项目下完整路径  
  55.         String url = requestUri.substring(contextPath.length()); //请求页面  
  56.         logger.debug("======拦截器配置成功======");  
  57.         logger.debug("======拦截来自:"+requestUri+"的请求=======");  
  58.         logger.debug("======拦截的页面路径是:==:"+url+"=======");  
  59.         //throw new Exception("登录超时!");  
  60.           
  61.         if(oper == null){//如果获取不到登录的session  
  62.             //如果是ajax请求  
  63.             if (request.getHeader("x-requested-with") != null   
  64.                     && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){   
  65.                 response.setHeader("sessionstatus""timeout"); // 响应头设置session状态   
  66.                 return false;  //session超时,ajax访问返回false  
  67.             }  
  68.         }  
  69.           
  70.         return super.preHandle(request, response, handler);  
  71.     }  
  72.       
  73. }  
以上代码有一些log打印根据自己需要,可以只选其中必须的代码


有了配置文件,也有了拦截器,在拦截器中已经设置了返回的信息,而这些信息会被 JavaScript 获取到。

$.ajaxSetup方法是来设置AJAX请求默认选项的,我们可以认为是全局的选项设置,因此可以将这段代码提到外部JS文件中,在需要的页面引用。


[javascript]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 设置未来(全局)的AJAX请求默认选项 
  3.  * 主要设置了AJAX请求遇到Session过期的情况 
  4.  */  
  5.   
  6. $.ajaxSetup({  
  7.   type: 'POST',  
  8.   contentType:"application/x-www-form-urlencoded;charset=utf-8",  
  9.   complete: function(xhr,status) {  
  10.     var sessionStatus = xhr.getResponseHeader('sessionstatus');  
  11.     if(sessionStatus == 'timeout') {  
  12.       //var top = getTopWinow();  
  13.       //var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.');  
  14.       //if (yes) {  
  15.         alert("登录超时,请重新登录!");  
  16.         window.location.href = '/admin/login/out.do';  
  17.       //}  
  18.     }  
  19.   }  
  20. });  
  21.   
  22. /** 
  23. * 在页面中任何嵌套层次的窗口中获取顶层窗口 
  24. * @return 当前页面的顶层窗口对象 
  25. */  
  26.   
  27. function getTopWinow(){  
  28.   var p = window;  
  29.   while(p != p.parent){  
  30.     p = p.parent;  
  31.   }  
  32.   return p;  
  33. }  


在这里不得不说一下 ajaxSetup 中的 contentType ,若不设置,有可能弹出的信息是中文,但是往往会出现编码乱码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值