詳解AngularJs HTTP響應(yīng)攔截器實(shí)現(xiàn)登陸、權(quán)限校驗(yàn)
$httpAngularJS 的 $http 服務(wù)允許我們通過發(fā)送 HTTP 請求方式與后臺(tái)進(jìn)行通信。在某些情況下,我們希望可以俘獲所有的請求,并且在將其發(fā)送到服務(wù)端之前進(jìn)行操作。還有一些情況是,我們希望俘獲響應(yīng),并且在完成完成調(diào)用之前處理它。一個(gè)很好例子就是處理全局 http 異常。攔截器(Interceptors)應(yīng)運(yùn)而生。本文將介紹 AngularJS 的攔截器,并且給幾個(gè)有用的例子。
什么是攔截器?
$httpProvider 中有一個(gè) interceptors 數(shù)組,而所謂攔截器只是一個(gè)簡單的注冊到了該數(shù)組中的常規(guī)服務(wù)工廠。下面的例子告訴你怎么創(chuàng)建一個(gè)攔截器:
<!-- 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 數(shù)組:
<!-- lang: js --> module.config(['$httpProvider', function($httpProvider) { $httpProvider.interceptors.push('myInterceptor'); }]);
攔截器允許你:
- 通過實(shí)現(xiàn) request 方法攔截請求: 該方法會(huì)在 $http 發(fā)送請求道后臺(tái)之前執(zhí)行,因此你可以修改配置或做其他的操作。該方法接收請求配置對象(request configuration object)作為參數(shù),然后必須返回配置對象或者 promise 。如果返回?zé)o效的配置對象或者 promise 則會(huì)被拒絕,導(dǎo)致 $http 調(diào)用失敗。
- 通過實(shí)現(xiàn) response 方法攔截響應(yīng): 該方法會(huì)在 $http 接收到從后臺(tái)過來的響應(yīng)之后執(zhí)行,因此你可以修改響應(yīng)或做其他操作。該方法接收響應(yīng)對象(response object)作為參數(shù),然后必須返回響應(yīng)對象或者 promise。響應(yīng)對象包括了請求配置(request configuration),頭(headers),狀態(tài)(status)和從后臺(tái)過來的數(shù)據(jù)(data)。如果返回?zé)o效的響應(yīng)對象或者 promise 會(huì)被拒絕,導(dǎo)致 $http 調(diào)用失敗。
- 通過實(shí)現(xiàn) requestError 方法攔截請求異常: 有時(shí)候一個(gè)請求發(fā)送失敗或者被攔截器拒絕了。請求異常攔截器會(huì)俘獲那些被上一個(gè)請求攔截器中斷的請求。它可以用來恢復(fù)請求或者有時(shí)可以用來撤銷請求之前所做的配置,比如說關(guān)閉進(jìn)度條,激活按鈕和輸入框什么之類的。
- 通過實(shí)現(xiàn) responseError 方法攔截響應(yīng)異常: 有時(shí)候我們后臺(tái)調(diào)用失敗了。也有可能它被一個(gè)請求攔截器拒絕了,或者被上一個(gè)響應(yīng)攔截器中斷了。在這種情況下,響應(yīng)異常攔截器可以幫助我們恢復(fù)后臺(tái)調(diào)用。
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; }
因此,我們可以通過攔截器來判斷用于的登陸與權(quán)限問題。
代碼中的 $rootScope.user是登錄后把用戶信息放到了全局rootScope上,方便其他地方使用,$rootScope.defaultPage也是默認(rèn)主頁面,初始化的時(shí)候?qū)懰赖絩ootScope里的。
$rootScope.$on('$stateChangeStart',function(event, toState, toParams, fromState, fromParams){ if(toState.name=='login')return;// 如果是進(jìn)入登錄界面則允許 // 如果用戶不存在 if(!$rootScope.user || !$rootScope.user.token){ event.preventDefault();// 取消默認(rèn)跳轉(zhuǎn)行為 $state.go("login",{from:fromState.name,w:'notLogin'});//跳轉(zhuǎn)到登錄界面 } });
另外還有用戶已經(jīng)登錄,但是登錄超時(shí)了,還有就是增加后臺(tái)接口的判斷來增強(qiáng)安全性。不能完全依靠本地邏輯
我們在model里面增加一個(gè)用戶攔截器,在rensponseError中判斷錯(cuò)誤碼,拋出事件讓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; // 判斷錯(cuò)誤碼,如果是未登錄 if(data["errorCode"] == "500999"){ // 清空用戶本地token存儲(chǔ)的信息,如果 $rootScope.user = {token:""}; // 全局事件,方便其他view獲取該事件,并給以相應(yīng)的提示或處理 $rootScope.$emit("userIntercepted","notLogin",response); } // 如果是登錄超時(shí) if(data["errorCode"] == "500998"){ $rootScope.$emit("userIntercepted","sessionOut",response); } return $q.reject(response); } }; }]);
別忘了要注冊攔截器到angularjs的config中哦
app.config(function ($httpProvider) { $httpProvider.interceptors.push('UserInterceptor'); });
最后在controller中處理錯(cuò)誤事件
$rootScope.$on('userIntercepted',function(errorType){ // 跳轉(zhuǎn)到登錄界面,這里我記錄了一個(gè)from,這樣可以在登錄后自動(dòng)跳轉(zhuǎn)到未登錄之前的那個(gè)界面 $state.go("login",{from:$state.current.name,w:errorType}); });
最后還可以在loginController中做更多的細(xì)節(jié)處理
// 如果用戶已經(jīng)登錄了,則立即跳轉(zhuǎn)到一個(gè)默認(rèn)主頁上去,無需再登錄 if($rootScope.user.token){ $state.go($rootScope.defaultPage); return; }
另外在登錄成功回調(diào)后還可以跳轉(zhuǎn)到上一次界面,也就是上面記錄的from
var from = $stateParams["from"]; $state.go(from && from != "login" ? from : $rootScope.defaultPage);
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js實(shí)現(xiàn)登錄注冊框手機(jī)號(hào)和驗(yàn)證碼校驗(yàn)(前端部分)
- JavaScript 完成注冊頁面表單校驗(yàn)的實(shí)例
- JavaScript注冊時(shí)密碼強(qiáng)度校驗(yàn)代碼
- js簡單實(shí)現(xiàn)用戶注冊信息的校驗(yàn)代碼
- JS校驗(yàn)與最終登陸界面功能完整示例
- Angular.js與node.js項(xiàng)目里用cookie校驗(yàn)賬戶登錄詳解
- jsp登陸校驗(yàn)演示 servlet、login、success
- 攔截JSP頁面,校驗(yàn)是否已登錄詳解及實(shí)現(xiàn)代碼
- ASP.NET MVC結(jié)合JavaScript登錄、校驗(yàn)和加密
- javascript使用正則表達(dá)式實(shí)現(xiàn)注冊登入校驗(yàn)
相關(guān)文章
Angular 2.x學(xué)習(xí)教程之結(jié)構(gòu)指令詳解
結(jié)構(gòu)指令通過添加和刪除 DOM 元素來更改 DOM 布局。Angular 中兩個(gè)常見的結(jié)構(gòu)指令是 *ngIf 和 *ngFor,下面這篇文章主要給大家介紹了關(guān)于Angular 2.x結(jié)構(gòu)指令的相關(guān)資料,需要的朋友可以參考下。2017-05-05詳解Angular.js的$q.defer()服務(wù)異步處理
相信大家都知道jquery和angular都有defer服務(wù),這篇文章暫以angular為例談?wù)剛€(gè)人的理解,在文章的最后并附上jquery的阮一峰總結(jié)的defer。有需要的朋友們也可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11完美解決UI-Grid表格元素中多個(gè)空格顯示為一個(gè)空格的問題
下面小編就為大家?guī)硪黄昝澜鉀QUI-Grid表格元素中多個(gè)空格顯示為一個(gè)空格的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04Angular5中提取公共組件之radio list的實(shí)例代碼
這篇文章主要介紹了Angular5中提取公共組件之radio list的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07Angular6實(shí)現(xiàn)拖拽功能指令drag實(shí)例詳解
這篇文章主要為大家介紹了Angular6實(shí)現(xiàn)拖拽功能指令drag實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11AngularJs自定義服務(wù)之實(shí)現(xiàn)簽名和加密
AngularJS 是一個(gè) JavaScript 框架,它可以通過 <script> 標(biāo)簽添加到 HTML 頁面。這篇文章主要介紹了AngularJs自定義服務(wù)之實(shí)現(xiàn)簽名和加密的相關(guān)資料,需要的朋友可以參考下2016-08-08