處理session過期(401)身份過期使用者重新登陸的方法之重寫ajax
阿新 • • 發佈:2019-01-08
前言
之前在專案中遇到一個問題,就是在專案中為了安全起見,設定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(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請求的方法中新增狀態碼判斷的程式碼了,由此可見,在程式碼程式設計中重寫框架的方法也是很重要的一項技能。