使用jquery进行超时处理,后台用springmvc来接受Ajax请求(根据req.getHeader判断),假如超时,在请求头中设置sessionstatus为timeout。
// 判断如果没有取到用户信息,就跳转到登陆页面 if (user == null || user.getuName() == null || "".equals(user.getuName())) { if (req.getHeader("x-requested-with") != null && req.getHeader("x-requested-with").equalsIgnoreCase( "XMLHttpRequest"))// 如果是ajax请求响应头会有,x-requested-with; { res.setHeader("sessionstatus", "timeout");// 在响应头设置session状态 logger.info("==== Get AJAX timerout"); return ; } // 跳转到登陆页面 res.sendRedirect(req.getContextPath() + "/user/loginPage.action"); } else { // 已经登陆,继续此次请求 logger.info("sessionId:" + session.getId()); chain.doFilter(request, response); }
前台注册jquery的全局事件,判断从后台返回的请求头
var ctx = document.getElementById("ctx").value; $.ajaxSetup({ contentType : "application/x-www-form-urlencoded;charset=utf-8", complete : function(XMLHttpRequest, textStatus) { var sessionstatus = XMLHttpRequest .getResponseHeader("sessionstatus"); // 通过XMLHttpRequest取得响应头,sessionstatus, if (sessionstatus == "timeout") { alert("会话超时"); // 如果超时就处理 ,指定要跳转的页面 window.location.replace(ctx+"/user/loginPage.action"); } } });
这样,判断session超时后,js控制将页面跳转至指定页面。
需要注意的是,ajaxSetup中的complete的function需要在一般ajax请求的success方法处理return后才处理,需要对success中的data做空值判断,例如:
$.ajax({ url:ctx+"/init/listUndeployedVM.action", type:'get', //data:'name=admin&password=123456', //向服务器提交的代码 dataType:'json', //规定从服务器返回的数据形式 success:function(data,status){ if(data == null){ return ; }
不然前台会在使用data处报错卡住。