重寫(xiě)ajax方法實(shí)現(xiàn)請(qǐng)求session過(guò)期時(shí)跳轉(zhuǎn)登錄頁(yè)面

今天的任務(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ò)展方法集中處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容