最近在公司做的项目一直测试和使用都很好,客户反响也很不错,但是,就在前两天,客户提出了一个bug,但是全队都愁眉不展,在今天做公交车的时候,我突然想到了一种可能,就是我们习以为常的ajax提交出了问题!
拦截器是spring-mvc的拦截器,在拦截器里判断是不是ajax请求:
<span style="font-size:18px;">1. public boolean preHandle(HttpServletRequest request, 2. HttpServletResponse response, Object handler) throws Exception 3. { 4. if (request.getSession().getAttribute("user") == null)//判断session里是否有用户信息 5. { 6. if (request.getHeader("x-requested-with") != null 7. && request.getHeader("x-requested-with") 8. .equalsIgnoreCase("XMLHttpRequest"))//如果是ajax请求响应头会有,x-requested-with; 9. { 10. response.setHeader("sessionstatus", "timeout");//在响应头设置session状态 11. return false; 12. } 13. 14. } 15. return true; 16. } </span>
这样,如果session超时,而且是ajax请求,就会在响应头里,sessionstatus有一个timeout;
再用一个全局的方法来处理,session超时要跳转的页面。
jquery 可以用$.ajaxSetup 方法,ext也有类似的方法
<span style="font-size:18px;">1. //全局的ajax访问,处理ajax清求时sesion超时 2. $.ajaxSetup({ 3. contentType:"application/x-www-form-urlencoded;charset=utf-8", 4. complete:function(XMLHttpRequest,textStatus){ 5. var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); //通过XMLHttpRequest取得响应头,sessionstatus, 6. if(sessionstatus=="timeout"){ 7. //如果超时就处理 ,指定要跳转的页面 8. window.location.replace("${path}/common/login.do"); 9. } 10. } 11. } 12. }); </span>
原文:http://blog.csdn.net/xvshu/article/details/43850339