您的位置:首页 > 其它

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

2017-06-08 19:11 846 查看
今天的任务是处理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 starus:"+xhr.starus);
console.log("status:"+status);
console.log("error:"+error);

运行时输出:

xhr starus:401
status:error
error:session timeout

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

其他异常也可以通过这种扩展方法集中处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐