对于普通的http请求,请求服务器,session超时的情况下,页面会自动跳转到登录页面。
但是对于Ajax请求,页面还是当前页面,不会跳转到登录页面。
看到网上很多方法,但是都不通用,下面是如何解决这个问题的例子。
一、请求页面修改
本例是基于jQuery框架为基础实现的。
创建一个login-timeout.js文件,拷贝如下代码。
$.ajaxSetup({ statusCode: { 999: function (data) { alert("登录超时");window.open ('/login.html','_top');} } })
由于是基于jQuery框架的,所以页面引用login-timeout.js文件的时候,一定要放在引入jQuery后面。
<script type="text/javascript" src="/js/jquery-1.8.0.min.js"></script><script type="text/javascript" src="/js/login-timeout.js"></script>
这样的话,相当于每个页面都要引入此文件,修改量大,所以可以把此js代码加在jquery-1.8.0.min.js里面。注意要放在最后,不能放在前面,因为是基于jQuery框架为基础的。
二、服务端修改
服务器端判断是否登录超时通常写在过滤器里面。
HttpServletResponse.setStatus(999);
即对于ajax请求返回的状态码设置成999,要和js里面的状态码保持一致,也可以是888、777等等,不要使用已被占有的状态码即可(200、302、404、505等)
【备注】其他http请求相关跳转登录统一处理:
try {res.setStatus(999);//ajax请求可以和普通请求一并处理,ajax请求会提前拦截res.setContentType("text/html");res.setCharacterEncoding("UTF-8");PrintWriter out = res.getWriter();out.println("<html>");out.println("<script>");out.println("alert(\"登录超时\");");out.println("window.open ('" + domainName + "/login.html','_top')");out.println("</script>");out.println("</html>");} catch (Exception e) {log.err("出现异常:", e);}