今天的任務(wù)是處理ajax請(qǐng)求session超時(shí),如果session過(guò)期需要跳轉(zhuǎn)到登錄頁(yè)面。
如果為每一個(gè)ajax請(qǐng)求都寫(xiě)上處理session超時(shí)的處理代碼,太麻煩了。就算是寫(xiě)到公共方法里面,在每一個(gè)ajax請(qǐng)求的處理函數(shù)里引用,也是非常不保險(xiǎn)的,萬(wàn)一有其他人或者新人寫(xiě)ajax請(qǐng)求,并沒(méi)有加上這段公共代碼,就會(huì)漏掉。
所以最好的方法是重寫(xiě)、擴(kuò)展ajax方法,把異常集中處理。
在網(wǎng)上查到一個(gè)可行的方法,重寫(xiě)ajax,擴(kuò)展success方法。代碼如下:
jQuery(function($){
var _ajax=$.ajax; // 備份jquery的ajax方法
$.ajax=function(opt){
var _success = opt && opt.success || function(a, b){}; //獲取ajax請(qǐng)求參數(shù)中的success方法;
var _opt = $.extend(opt, {
success:function(data, textStatus){
// 如果后臺(tái)將請(qǐng)求重定向到了登錄頁(yè),則data里面存放的就是登錄頁(yè)的源碼,這里需要找到data是登錄頁(yè)的標(biāo)記
//(這里是在文件中加了“weinianjie”然后注釋掉。)
if(data.indexOf('weinianjie') != -1) {
window.location.href= Globals.ctx + "/login.action";
return;
}
_success(data, textStatus); //執(zhí)行每個(gè)ajax自身的success方法
}
});
return _ajax(_opt); //返回新的加入了session超時(shí)處理的ajax方法。
};
});
我在使用過(guò)程中發(fā)現(xiàn),我的請(qǐng)求也被重定向了,但是并不是觸發(fā)success方法而是觸發(fā)error方法??蓞⒖迹?a href="http://www.itdecent.cn/p/11d675e3e75f" target="_blank">ajax在什么情況下走success和error
于是調(diào)整為重寫(xiě)ajax,擴(kuò)展其error方法。
session超時(shí)觸發(fā)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錯(cuò)誤
window.location.href= "登錄頁(yè)url";
return;
}
_error(xhr,status,error);
}
});
return _ajax(_opt);
};
};
以上擴(kuò)展方法需要放在你的所有ajax請(qǐng)求之前執(zhí)行。
把這段代碼放在js的最開(kāi)始執(zhí)行。之后運(yùn)行的ajax請(qǐng)求的success方法都將會(huì)加上關(guān)于session超時(shí)的處理,當(dāng)然每個(gè)ajax自己的success方法也會(huì)保留并執(zhí)行。
如何判斷session超時(shí)
通過(guò)在error中打印xhr.status和error可以迅速定位session過(guò)期時(shí)的返回內(nèi)容,并作為判斷依據(jù)。例如:
在error方法中加上:
console.log("xhr status:"+xhr.status);
console.log("status:"+status);
console.log("error:"+error);
運(yùn)行時(shí)輸出:
xhr status:401
status:error
error:session timeout
于是,最后就通過(guò)xhr.status=="401" && error.indexOf('session') != -1判斷session超時(shí),并作出處理。
其他異常也可以通過(guò)這種擴(kuò)展方法集中處理。