总结一下设计开发session登录超时的问题。
用到过滤器和ajaxSetup 技术
过滤器中doFilter方法
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String reqUrl = request.getRequestURI();//获取当前请求资源路径
//这里的判断是因为我对这两个路径的请求判断是否超时
if (reqUrl.startsWith("/clinic/") || reqUrl.startsWith("/diag/")) {
if (request.getHeader("x-requested-with") != null
&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {//判断是否是ajax请求
String userId = Utility.getLoginUserId();//获取当前session中的user是否存在
if (userId == null) {//登录超时user为空
response.setHeader("sessionstatus", "timeout");//定义1个头部信息便于判断
response.setHeader("url", "/Portal.jsp");//要跳转的登录页面
}
}
}
//如果为空证明没有登录超时继续下一个操作 不为空不继续执行
//如果不加此判断你这个ajax请求会继续操作数据库
if (response.getHeader("sessionstatus") == null) {
chain.doFilter(req, res);
}
}
js代码 我放在了通用的jquery.min.js里了
$.xhrPool = [];//ajax请求集合
$.xhrPool.abortAll = function() {//用于结束页面其他ajax请求
$(this).each(function(idx, jqXHR) {
jqXHR.abort();
});
$.xhrPool = [];
};
$.ajaxSetup({ //官方定义(为以后要用到的Ajax请求设置默认的值)
contentType:"application/x-www-form-urlencoded;charset=utf-8",
error: function (XMLHttpRequest, textStatus, errorThrown){
if(XMLHttpRequest.status==403){
alert('您没有权限访问此资源或进行此操作');
return false;
}
},beforeSend: function(jqXHR) {//开始前
$.xhrPool.push(jqXHR); //添加到ajax到集合里
},complete:function(XMLHttpRequest,textStatus){ //这里进行判断是否超时
var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); //通过XMLHttpRequest取得响应头,sessionstatus,
var url=XMLHttpRequest.getResponseHeader("url"); //获取登录页面
if(sessionstatus == 'timeout'){
$.xhrPool.abortAll(); //结束其他的ajax请求 否则可能造成多次提示超时
alert('登录超时, 请重新登录.');
window.location.href=url; //跳转到登陆页面
}
});