重写ajax方法实现请求session过期时跳转登录页面

今天的任务是处理ajax请求session超时,如果session过期需要跳转到登录页面。

如果为每一个ajax请求都写上处理session超时的处理代码,太麻烦了。就算是写到公共方法里面,在每一个ajax请求的处理函数里引用,也是非常不保险的,万一有其他人或者新人写ajax请求,并没有加上这段公共代码,就会漏掉。

所以最好的方法是重写、扩展ajax方法,把异常集中处理。

在网上查到一个可行的方法,重写ajax,扩展success方法。代码如下:

jQuery(function($){  
    var _ajax=$.ajax;   // 备份jquery的ajax方法
    $.ajax=function(opt){  
        var _success = opt && opt.success || function(a, b){};  //获取ajax请求参数中的success方法;
        var _opt = $.extend(opt, {  
            success:function(data, textStatus){  
                // 如果后台将请求重定向到了登录页,则data里面存放的就是登录页的源码,这里需要找到data是登录页的标记
                //(这里是在文件中加了“weinianjie”然后注释掉。)  
                if(data.indexOf('weinianjie') != -1) {  
                    window.location.href= Globals.ctx + "/login.action";  
                    return;  
                }  
                _success(data, textStatus);    //执行每个ajax自身的success方法
            }    
        });  
        return _ajax(_opt);  //返回新的加入了session超时处理的ajax方法。
    };  
}); 

我在使用过程中发现,我的请求也被重定向了,但是并不是触发success方法而是触发error方法。可参考:ajax在什么情况下走success和error
于是调整为重写ajax,扩展其error方法。

session超时触发error,代码如下:
function addTimeOutAction(){
    var _ajax = $.ajax; // 备份jquery的ajax方法
    $.ajax = function(opt){
        var _error = opt && opt.error || function(a, b, c){};
        var _opt = $.extend(opt, {
            error: function (xhr,status,error) {
                if(xhr.status=="401" && error.indexOf('session') != -1) {//session timeout; sessionOut返回401错误
                    window.location.href= "登录页url";  
                    return;
                }
                _error(xhr,status,error);
            }
        });
        return _ajax(_opt);
    };
};

以上扩展方法需要放在你的所有ajax请求之前执行。

把这段代码放在js的最开始执行。之后运行的ajax请求的success方法都将会加上关于session超时的处理,当然每个ajax自己的success方法也会保留并执行。

如何判断session超时

通过在error中打印xhr.status和error可以迅速定位session过期时的返回内容,并作为判断依据。例如:

在error方法中加上:

console.log("xhr status:"+xhr.status);
console.log("status:"+status);
console.log("error:"+error);

运行时输出:

xhr status:401
status:error
error:session timeout

于是,最后就通过xhr.status=="401" && error.indexOf('session') != -1判断session超时,并作出处理。

其他异常也可以通过这种扩展方法集中处理。

你可能感兴趣的:(重写ajax方法实现请求session过期时跳转登录页面)