溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

AngularJs中HTTP響應攔截器實現登陸、權限校驗的示例分析

發(fā)布時間:2021-07-07 14:22:50 來源:億速云 閱讀:221 作者:小新 欄目:web開發(fā)

這篇文章主要介紹了AngularJs中HTTP響應攔截器實現登陸、權限校驗的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

$httpAngularJS 的 $http 服務允許我們通過發(fā)送 HTTP 請求方式與后臺進行通信。在某些情況下,我們希望可以俘獲所有的請求,并且在將其發(fā)送到服務端之前進行操作。還有一些情況是,我們希望俘獲響應,并且在完成完成調用之前處理它。一個很好例子就是處理全局 http 異常。攔截器(Interceptors)應運而生。本文將介紹 AngularJS 的攔截器,并且給幾個有用的例子。

什么是攔截器?

$httpProvider 中有一個 interceptors 數組,而所謂攔截器只是一個簡單的注冊到了該數組中的常規(guī)服務工廠。下面的例子告訴你怎么創(chuàng)建一個攔截器:

<!-- lang: js -->
module.factory('myInterceptor', ['$log', function($log) {
  $log.debug('$log is here to show you that this is a regular factory with injection');

  var myInterceptor = {
    ....
    ....
    ....
  };

  return myInterceptor;
}]);

然后通過它的名字添加到 $httpProvider.interceptors 數組:

<!-- lang: js -->
module.config(['$httpProvider', function($httpProvider) {
  $httpProvider.interceptors.push('myInterceptor');
}]);

攔截器允許你:

  1. 通過實現 request 方法攔截請求: 該方法會在 $http 發(fā)送請求道后臺之前執(zhí)行,因此你可以修改配置或做其他的操作。該方法接收請求配置對象(request configuration object)作為參數,然后必須返回配置對象或者 promise 。如果返回無效的配置對象或者 promise 則會被拒絕,導致 $http 調用失敗。

  2. 通過實現 response 方法攔截響應: 該方法會在 $http 接收到從后臺過來的響應之后執(zhí)行,因此你可以修改響應或做其他操作。該方法接收響應對象(response object)作為參數,然后必須返回響應對象或者 promise。響應對象包括了請求配置(request configuration),頭(headers),狀態(tài)(status)和從后臺過來的數據(data)。如果返回無效的響應對象或者 promise 會被拒絕,導致 $http 調用失敗。

  3. 通過實現 requestError 方法攔截請求異常: 有時候一個請求發(fā)送失敗或者被攔截器拒絕了。請求異常攔截器會俘獲那些被上一個請求攔截器中斷的請求。它可以用來恢復請求或者有時可以用來撤銷請求之前所做的配置,比如說關閉進度條,激活按鈕和輸入框什么之類的。

  4. 通過實現 responseError 方法攔截響應異常: 有時候我們后臺調用失敗了。也有可能它被一個請求攔截器拒絕了,或者被上一個響應攔截器中斷了。在這種情況下,響應異常攔截器可以幫助我們恢復后臺調用。

angularJs提供四種攔截器,其中兩種成功攔截器(request、response),兩種失敗攔截器(requestError、responseError)。

angular.module("myApp", [])
  .factory('httpInterceptor', [ '$q', '$injector',function($q, $injector) {
    var httpInterceptor = {
      'responseError' : function(response) {
        ......
        return $q.reject(response);
      },
      'response' : function(response) {
        ......
        return response;
      },
      'request' : function(config) {
        ......
        return config;
      },
      'requestError' : function(config){
        ......
        return $q.reject(config);
      }
    }
    return httpInterceptor;
  }

因此,我們可以通過攔截器來判斷用于的登陸與權限問題。

代碼中的 $rootScope.user是登錄后把用戶信息放到了全局rootScope上,方便其他地方使用,$rootScope.defaultPage也是默認主頁面,初始化的時候寫死到rootScope里的。

$rootScope.$on('$stateChangeStart',function(event, toState, toParams, fromState, fromParams){
 if(toState.name=='login')return;// 如果是進入登錄界面則允許
 // 如果用戶不存在
 if(!$rootScope.user || !$rootScope.user.token){
 event.preventDefault();// 取消默認跳轉行為
 $state.go("login",{from:fromState.name,w:'notLogin'});//跳轉到登錄界面
 }
});

另外還有用戶已經登錄,但是登錄超時了,還有就是增加后臺接口的判斷來增強安全性。不能完全依靠本地邏輯

我們在model里面增加一個用戶攔截器,在rensponseError中判斷錯誤碼,拋出事件讓Contoller或view來處理

app.factory('UserInterceptor', ["$q","$rootScope",function ($q,$rootScope) {
 return {
    request:function(config){
      config.headers["TOKEN"] = $rootScope.user.token;
      return config;
    },
    responseError: function (response) {
      var data = response.data;
  // 判斷錯誤碼,如果是未登錄
      if(data["errorCode"] == "500999"){
  // 清空用戶本地token存儲的信息,如果
        $rootScope.user = {token:""};
  // 全局事件,方便其他view獲取該事件,并給以相應的提示或處理
        $rootScope.$emit("userIntercepted","notLogin",response);
      }
  // 如果是登錄超時
  if(data["errorCode"] == "500998"){
        $rootScope.$emit("userIntercepted","sessionOut",response);
      }
      return $q.reject(response);
    }
  };
}]);

別忘了要注冊攔截器到angularjs的config中哦

app.config(function ($httpProvider) {
  $httpProvider.interceptors.push('UserInterceptor');
});

最后在controller中處理錯誤事件

$rootScope.$on('userIntercepted',function(errorType){
  // 跳轉到登錄界面,這里我記錄了一個from,這樣可以在登錄后自動跳轉到未登錄之前的那個界面
  $state.go("login",{from:$state.current.name,w:errorType});
});

最后還可以在loginController中做更多的細節(jié)處理

// 如果用戶已經登錄了,則立即跳轉到一個默認主頁上去,無需再登錄
if($rootScope.user.token){
  $state.go($rootScope.defaultPage);
  return;
}

另外在登錄成功回調后還可以跳轉到上一次界面,也就是上面記錄的from

var from = $stateParams["from"];
$state.go(from && from != "login" ? from : $rootScope.defaultPage);

感謝你能夠認真閱讀完這篇文章,希望小編分享的“AngularJs中HTTP響應攔截器實現登陸、權限校驗的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI