前言
之前在项目中遇到一个问题,就是在项目中为了安全起见,设置session的有效期限,当用户登录超过这个有效期限,希望用户重新验证自己的身份,证明是本人的操作,需要要用户重新登陆,即当session过期时,用户操作与服务器发生交互,服务器返回401的状态码,跳转回到登录页面,让用户重新登陆的过程,这并不难实现,且看如下代码:
$.ajax({
url:'请求地址',
type:'POST',
data:null,//向服务器发送的数据,这里用于演示,设为null
success:function(data){
//请求成功
},
error:function(xhr, textStatus, errorThrown){
//请求失败
//通过状态码判断401
if (xhr.status === 401) {
alert('您好,身份验证已过期,请重新登陆。');
//返回首页
window.location.href = '首页的地址';
}
}
});
这样就很轻松的实现了需求,但是,现在问题来了,当项目中已经写了成百上千的ajax请求时,有的是$.load函数,有的是$.loadScript或$.get等等,领导说要做这个功能,你怎么办?一个个在error的函数中加401状态判断的代码吗?那样可以把自己玩死,这时很容易就想到,重写jquery的ajax方法,但是为什么是$.ajax()这个方法呢?因为这个方法是jquery ajax请求的最底层的方法。代码如下:
//重写ajax方法
jQuery(function($) {
// 备份jquery的ajax方法
var _ajax = $.ajax;
$.ajax = function(opt) {
var _error = opt && opt.error || function(a, b, c) {};
//修改传入对象的error函数
var _opt = $.extend(opt, {
error: function(xhr, textStatus, errorThrown) {
//通过状态码判断401
if (xhr.status === 401) {
alert('您好,身份验证已过期,请重新登陆。');
//返回首页
window.location.href = '首页的地址';
return;
}
_error(xhr, textStatus, errorThrown);
}
});
//注意这里需要返回_ajax(_opt),否则在链式调用时会报错
return _ajax(_opt);
};
});
这样就不需要在每个ajax请求的方法中添加状态码判断的代码了,由此可见,在代码编程中重写框架的方法也是很重要的一项技能。