今天的任務是處理ajax請求session超時,如果session過期需要跳轉(zhuǎn)到登錄頁面复斥。
如果為每一個ajax請求都寫上處理session超時的處理代碼深纲,太麻煩了。就算是寫到公共方法里面裸违,在每一個ajax請求的處理函數(shù)里引用,也是非常不保險的本昏,萬一有其他人或者新人寫ajax請求供汛,并沒有加上這段公共代碼,就會漏掉。
所以最好的方法是重寫紊馏、擴展ajax方法,把異常集中處理蒲犬。
在網(wǎng)上查到一個可行的方法朱监,重寫ajax,擴展success方法原叮。代碼如下:
jQuery(function($){
var _ajax=$.ajax; // 備份jquery的ajax方法
$.ajax=function(opt){
var _success = opt && opt.success || function(a, b){}; //獲取ajax請求參數(shù)中的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); //執(zhí)行每個ajax自身的success方法
}
});
return _ajax(_opt); //返回新的加入了session超時處理的ajax方法。
};
});
我在使用過程中發(fā)現(xiàn)唯欣,我的請求也被重定向了嘹吨,但是并不是觸發(fā)success方法而是觸發(fā)error方法【城猓可參考:ajax在什么情況下走success和error
于是調(diào)整為重寫ajax蟀拷,擴展其error方法。
session超時觸發(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錯誤
window.location.href= "登錄頁url";
return;
}
_error(xhr,status,error);
}
});
return _ajax(_opt);
};
};
以上擴展方法需要放在你的所有ajax請求之前執(zhí)行问芬。
把這段代碼放在js的最開始執(zhí)行。之后運行的ajax請求的success方法都將會加上關于session超時的處理寿桨,當然每個ajax自己的success方法也會保留并執(zhí)行此衅。
如何判斷session超時
通過在error中打印xhr.status和error可以迅速定位session過期時的返回內(nèi)容,并作為判斷依據(jù)亭螟。例如:
在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超時,并作出處理媒佣。
其他異常也可以通過這種擴展方法集中處理匕累。