您的位置:首页 > 其它

重写ajax方法实现异步请求session过期时跳转

2016-12-25 15:58 801 查看
转载自:http://blog.csdn.net/weinianjie1/article/details/38270477

一般我们会在过滤器里判断登录状态,如果没登录就跳转登录页面,过滤器Java核心代码如下:

[java] view
plain copy

 





UserItem loginUser = (UserItem)request.getSession().getAttribute("loginUser");  

if(loginUser == null) {  

    response.sendRedirect("/login.action");  

}  

这个对于普通页面来说完全没问题,但是在使用ajax的时候往往得不到想要的效果。因为页面根本没跳转,只是捕获到了登录页面的源码而已。

网上一堆庸人给出一堆扯蛋的方法,主要有。
1.返回的字符串附加登录状态;(那么多,你愿意改么,而且前后端都得改,编码的时候还要总去考虑那个状态烦不烦)
2.修改http头信息;(装B深沉型)
3.修改jQuery源文件判断;(勉强算个程序员,但是尽力不去动源,性能问题你还得解压再压缩,别人也不一定知道你改过源码)
我的解决方案跟第三种方法思路接近,重写ajax方法实现前置处理,代码如下:

[javascript] view
plain copy

 





jQuery(function($){  

    // 备份jquery的ajax方法    

    var _ajax=$.ajax;  

    // 重写ajax方法,先判断登录在执行success函数   

    $.ajax=function(opt){  

        var _success = opt && opt.success || function(a, b){};  

        var _opt = $.extend(opt, {  

            success:function(data, textStatus){  

                // 如果后台将请求重定向到了登录页,则data里面存放的就是登录页的源码,这里需要找到data是登录页的证据(标记)  

                if(data.indexOf('weinianjie') != -1) {  

                    window.location.href= Globals.ctx + "/login.action";  

                    return;  

                }  

                _success(data, textStatus);    

            }    

        });  

       return _ajax(_opt);  // 需要返回,否则在使用$.load的时候会报错:Uncaught
TypeError:                                                  // Cannot call method 'done' of undefined。

    };  

});  

在登录页面的源码里面,你随便找个地方打个标记然后隐藏掉,比如我的标记就是weinianjie。对于$.get和$.post就不用说了吧,这两个方法都是调用了$.ajax方法的,所以也就自动获取了前置判断能力。
大功告成,注意以上扩展需要放在你的所有ajax请求之前执行。

说明:Globals.ctx 可以通过以下函数来获取:

function getRootPath() {
// var pathName = window.location.pathname.substring(1);
// var webName = pathName == '' ? '' : pathName.substring(0, pathName.indexOf('/'));
// return window.location.protocol + '//' + window.location.host + '/' + webName + '/';
return window.location.protocol + '//' + window.location.host;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐