1. 程式人生 > >處理session過期(401)身份過期使用者重新登陸的方法之重寫ajax

處理session過期(401)身份過期使用者重新登陸的方法之重寫ajax

前言

之前在專案中遇到一個問題,就是在專案中為了安全起見,設定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請求的方法中新增狀態碼判斷的程式碼了,由此可見,在程式碼程式設計中重寫框架的方法也是很重要的一項技能。