处理 Ajax session 超时

2015-10-13 veryyoung 更多博文 » 博客 » GitHub »

原文链接 http://veryyoung.me/blog/2015/10/13/ajax-session-timeout..html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


很多应用都在需要用户登陆的 controller 添加了拦截器,未登陆或登陆超时会被重定向到登陆页面。

但是长期不操作 session 过期之后,执行 Ajax 请求,返回的数据会直接是登陆页面的 html 文件。

这样用户操作起来会得不到任何的反馈,没有返回数据,也没重定向到登陆页面。

<!-- more -->


我们需要单独处理 Ajax 请求。

Ajax 请求头中带有 X-Requested-With 信息,其值为 XMLHttpRequest,这正是我们可以利用的地方。

可以在拦截器里面判断请求是否来自 Ajax,如果来自 Ajax,设置一个标示:

        //如果是ajax请求响应头会有,x-requested-with
        if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
            response.setHeader("sessionStatus", "timeout");//在响应头设置session状态
            return false;
        }

接下来就是 js 的事情了。

Ajax 可以全局设置:

$.ajaxSetup({  
    type: 'POST',  
    complete: function(xhr,status) {  
        var sessionStatus = xhr.getResponseHeader('sessionstatus');  
        if(sessionStatus == 'timeout') {  
            window.location.href = '/login';              
        }  
    }  
});

这样 Ajax 请求的时候,如果 session 过期了也会重定向到 login 页面了!