在做项目的时候,有时会遇到session超时问题,如果session超时,平常请求没有什么问题,通过拦截器可以正确跳到登陆界面,可是你如果用ajax请求的话这就出问题了,因为ajax是异步的,局部刷新,所以登陆界面不会再全页面中显示,他只会显示到页面一部分当中。所以根据这几年的经验找到认为比较好的方法。因为用的是和struts2集成的,所以就在拦截器中进行设置:
首先判断session是否为空就是判断session是否超时,如果超时就取出请求的head头信息request.getHeader("x-requested-with"),如果不为空就和XMLHttpRequest(Ajax)标识进行比较(request.getHeader("x-requested-with"),equalslgnoreCase("XMLHttpRequest"))如果相等说明此请求是ajax请求。如果是ajax请求就可以response,setHeader("键",“值”)来设置一个标识来告诉用户这是ajax请求并且session超时时发出的,这样我就可以再回调函数中取出自己的那个唯一标识:XMLHttpRequest.getResponseHeader(""),如果取出的值和自己在后台中设置的值一样的话,就证明session已经超时,这样就可以设置window,location.replace("登陆界面"),来跳转到登陆界面。
这样做虽然解决了问题,但是,会在每个回调函数中写入那些代码,这样的话代码就会显得特别零散,所以就像能不能定义一个全局的设置所以了jquery的ajaxSetUp方法,通过ajaxSet对jquery的ajax进行全局的判断(ajaxSetUp就相当于ajax的拦截器),通过设置ajaxSetUp里的comlete,他就相当于回调函数,这样就弥补了上一方法的不足。还用到$(document).ajaxStart()这是ajax请求时的事件;$(document).ajaxSuccess();这是Ajax请求成功之后的事件。我一般用他们来显示遮罩层和隐藏遮罩层用的加遮罩层时为了不让用户重复提交,更提交了用户体验度,让用户知道已经是提交了。