会话超时丢失了登录信息,那么页面将会跳转到login.jsp。必要注意的是,登录时验证用户名和暗码的方法不可以拦截,不然将不可以登录。
二、异步请求下的会话超时处理
上述方法可以处理同步请求下会话超时的难题,可是跳转到登录页是办事端跳转,假设应用Ajax技术发起请求,显然是无法处理页面跳转的,所以在做登录验证拦截时,必要返回一个字符串,报告客户端会话超时,客户端再做出客户端跳转。
首先必要办事端去判断,请求是同步请求和异步请求,在firefox的firebug插件帮助下,发现现在端应用JQuery和Ext框架时(别的框架未作检测),会在请求头部参加X-Requested-With的头信息,而同步请求没有这个头信息。所以,可以经过X-Requested-With这个请求头,判断请求是同步还是异步的,在拦截器里,参加该判断。
private String isAjax(HttpServletRequest request,HttpServletResponse response){
if(request.getHeader(“x-requested-with“)!=null
&& request.getHeader(“x-requested-with“).equalsIgnoreCase(“XMLHttpRequest“)){
PrintWriter writer = response.getWriter();
writer.print(“{sessionState:0}“);
return null;
} else { return Action.LOGIN; }
}
在拦截器的intercept方法里,将代码改为:
if (session.get(“user“)==null) { return isAjax; }
这样假设是异步请求,客服端只必要判断传回的值为{sessionState:0},即为登录超时或未登录。可是每个Ajax请求均如此处理,会显得即为繁琐。以JQuery为例,提供了几个全局方法,可以定义JQuery的全局方法来实现该判断。
$.ajaxSetup({
complete:function(XMLHttpRequest, status){
var res=XMLHttpRequest.responseText;
if(res==“{sessionState:0}“){ location.href = “login.jsp“;}
}
});
该方法在每个Ajax请求完成时触发,会判断客服端只必要判断传回的值是否为{sessionState:0},是即执行跳转。