亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳解Angular.js中$http攔截器的介紹及使用

2019-11-19 16:10:50
字體:
來源:轉載
供稿:網友

前言

$http service在Angular中用于簡化與后臺的交互過程,其本質上使用XMLHttpRequestJSONP進行與后臺的數據交互。在與后臺的交互過程中,可能會對每條請求發送到Server之前進行預處理(如加入token),或者是在Server返回數據到達客戶端還未被處理之前進行預處理(如將非JSON格式數據進行轉換);當然還有可能對在請求和響應過程過發生的問題進行捕獲處理。所有這些需求在開發中都非常常見,所以Angular為我們提供了$http攔截器,用來實現上述需求。

什么是攔截器

顧名思義,攔截器就是在目標達到目的地之前對其進行處理以便處理結果更加符合我們的預期。Angular的$http攔截器是通過$httpProvider.interceptors數組定義的一組攔截器,每個攔截器都是實現了某些特定方法的Factory:

實現攔截器

http攔截器一般通過定義factory的方式實現:

myApp.factory('MyInterceptor', function($q) { return { // 可選,攔截成功的請求 request: function(config) {  // 進行預處理  // ...  return config || $q.when(config); }, // 可選,攔截失敗的請求 requestError: function(rejection) {  // 對失敗的請求進行處理  // ...  if (canRecover(rejection)) {  return responseOrNewPromise  }  return $q.reject(rejection); }, // 可選,攔截成功的響應 response: function(response) {  // 進行預處理  // ....  return response || $q.when(reponse); }, // 可選,攔截失敗的響應 responseError: function(rejection) {  // 對失敗的響應進行處理  // ...  if (canRecover(rejection)) {  return responseOrNewPromise  }  return $q.reject(rejection); } };});

隨后,我們需要將實現的攔截器加入到$httpProvider.interceptors數組中,此操作一般在config方法中進行:

myApp.config(function($httpProvider) { $httpProvider.interceptors.push(MyInterceptor);});

當然,我們也可以通過匿名factroy的方式實現:

$httpProvider.interceptors.push(function($q) { return { request: function(config) {  // bala }, response: function(response) {  // bala }, // bala };});

可以看到,每個攔截器都可以實現4個可選的處理函數,分別對應請求(成功/失?。┖晚憫ǔ晒?失?。┑臄r截:

1、request:此函數在$http向Server發送請求之前被調用,在此函數中可以對成功的http請求進行處理,其包含一個http config對象作為參數,這里對config對象具有完全的處理權限,甚至可以重新構造,然后直接返回此對象或返回包含此對象的promise即可。如果返回有誤,會造成$http請求失敗。如開發中經常需要在請求頭中加入token以便驗證身份,我們可以作如下處理:

request: function(config) { config.headers = config.headers || {}; if ($window.sessionStorage.token) {  config.headers['X-Access-Token'] = $window.sessionStorage.token; } return config || $q.when(config);}

2、requestError:此方法會在前一個攔截器拋出異?;蜻M行了reject操作時被調用,在這里可以進行恢復請求的操作,或者進行一些對于請求時發起動作的處理(如取消loading等);

3、response:此函數在$http從Server接收到響應時被調用,在此函數中可以對成功的http響應進行處理,這里具有對響應的完全處理權限,甚至可以重新構造,然后直接返回響應或返回包含響應的promise即可。如果返回有誤,會造成$http接收響應失?。?br />

4、responseError:此方法會在前一個攔截器拋出異?;蜻M行了reject操作時被調用,在這里可以進行恢復響應的操作,進行一些針對錯誤的處理。

使用用例

為演示Angular $http攔截器的使用方法,下面通過幾個常用的用例來說明:

利用request攔截器模擬實現Angular的XSRF(即CSRF)防御

CSRF,即“跨站請求偽造”,不過不知道為什么Angular將其稱為XSRF。當處理與后臺交互時,Angular的$http會嘗試從客戶端cookie中讀取一個token,其默認的key為XSRF-TOKEN,并構造一個名為X-XSRF-TOKEN的http頭部,與http請求一起發送到后臺。Server端就可以根據此token識別出請求來源于同域,當然跨域的請求$http不會加入X-XSRF-TOKEN頭部。那我們可以利用request攔截器通過如下方式在同域請求頭部中加入此頭部以達到模擬Angular的XSRF(即CSRF)防御機制的實現效果:

/*** 正式開發中Angular會主動進行XSRF防御(只要cookie中存在key為`XSRF-TOKEN`的token),* 一般不需要手動進行,除非cookie中不存在key為`XSRF-TOKEN`的token,這里只是模擬實現*/request: function(config) { if(config.url.indexOf('SAME_DOMAIN_API_URL') > -1) { config.headers['X-XSRF-TOKEN'] = $cookies.get('XSRF-TOKEN'); } return config;}

如果初始http請求頭部類似于:

"headers": { "Accept": "application/json, text/plain, */*"}

那么經過上述的攔截器后,其http請求頭部就變成了:

"headers": { "Accept": "application/json, text/plain, */*", "X-XSRF-TOKEN": X-XSRF-TOKEN-VALUE}

利用response攔截器模擬實現Angular JSON易損性(JSON vulnerability)防御

Angular在$http請求安全性方面不僅為我們設計了XSRF(CSRF)防御,而且針對請求JSON數據的Url可能通過類似于<script>標簽加載的方式被惡意網站獲取到我們的JSON數據的情況,設計了Angular JSON易損性(JSON vulnerability)防御,即Server端返回的JSON數據頭部可以添加")]}',/n"字符串,得到包含此前綴的響應數據后,Angular會將此前綴刪去,將響應還原成正式的JSON數據。此時我們就可以通過response攔截器模擬此過程:

response: function(response) { var data = examineJSONResponse(response); // 假設存在這樣一個方法 if(!data) {  response = validateJSONResponse(response); // 假設存在這樣一個方法 } return response || $q.when(reponse);}

利用request攔截器和response攔截器計算http請求耗時

這個需求可能在開發中并不常用,這里只是作為同時使用request攔截器和response攔截器的例子,我們可以在request攔截器和response攔截器中分別計時,然后求得其差值即可:

myApp.factory('timestampMarker', [function() { return {  request: function(config) {   config.requestTimestamp = new Date().getTime();   return config;  },  response: function(response) {   response.config.responseTimestamp = new Date().getTime();   return response;  } };}]);myApp.config(['$httpProvider', function($httpProvider) { $httpProvider.interceptors.push('timestampMarker');}]);

這樣我們在每次請求后臺時,就能夠計算出相應請求的耗時了,如:

$http.get('https://api.github.com/users/liuwenzhuang/repos').then(function(response) { var time = response.config.responseTimestamp - response.config.requestTimestamp; console.log('The request took ' + (time / 1000) + ' seconds.');});

總結

$http作為Angular中的核心service,其功能非常強大便捷,今天描述了其子功能http攔截器的概念和描述方式,有理解不正確的地方,請大家留言告知。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久77777| 5566日本婷婷色中文字幕97| 红桃视频成人在线观看| 91精品国产综合久久香蕉922| 自拍亚洲一区欧美另类| 国模精品一区二区三区色天香| 久久久精品美女| 成人午夜在线视频一区| 一区二区中文字幕| 欧美国产日韩在线| 亚洲综合第一页| 亚洲欧洲一区二区三区在线观看| 久久久久久久国产精品视频| 国产精品成人aaaaa网站| 欧美一级片免费在线| 亚洲欧美日韩国产成人| 色综合伊人色综合网| 91在线视频免费| 国产成人在线精品| 亚洲欧洲自拍偷拍| 欧美日韩国产成人在线观看| 永久免费看mv网站入口亚洲| 久久精品视频va| 国产成人精品999| 亚洲免费人成在线视频观看| 中日韩午夜理伦电影免费| 中文字幕亚洲欧美一区二区三区| 久国内精品在线| 欧美巨大黑人极品精男| 欧美精品videofree1080p| 欧美激情高清视频| 色琪琪综合男人的天堂aⅴ视频| 97成人精品区在线播放| 日本精品视频网站| 亚洲色图五月天| 亚洲第一男人天堂| 一区二区中文字幕| 国外成人在线直播| 搡老女人一区二区三区视频tv| 欧美精品免费在线观看| 综合国产在线视频| 日韩精品视频中文在线观看| 国产激情久久久| 日韩一区二区福利| 久热精品视频在线观看一区| 日本乱人伦a精品| 另类天堂视频在线观看| 青青a在线精品免费观看| 另类专区欧美制服同性| 免费不卡在线观看av| 亚洲精品一二区| 日韩有码在线电影| 欧美另类极品videosbest最新版本| 国产欧美亚洲精品| 国产精品免费视频xxxx| 欧美性xxxx在线播放| 第一福利永久视频精品| 久久精品国产成人| 午夜精品一区二区三区视频免费看| 自拍偷拍亚洲欧美| 国产免费久久av| 国产精品人成电影| 欧美色播在线播放| 亚洲综合第一页| 亚洲国产精品人人爽夜夜爽| 激情成人中文字幕| 久久中文字幕在线视频| 超在线视频97| 一区二区三区四区在线观看视频| 欧美视频在线观看免费| 亚洲性av在线| 亚洲国产精品久久精品怡红院| 国产精品成久久久久三级| 国产午夜一区二区| 国产日韩欧美在线视频观看| 国产久一一精品| 国产精品久久久久久久久久久新郎| 亚洲男人天堂2024| 8050国产精品久久久久久| 亚洲人成毛片在线播放| 国产日韩欧美电影在线观看| 最新69国产成人精品视频免费| 成人免费看片视频| 欧美性猛交xxxx免费看漫画| 日韩中文字幕视频在线观看| 国产精品久久久久77777| 日本精品一区二区三区在线播放视频| 日韩av中文字幕在线播放| 黄色一区二区在线| 九九综合九九综合| 亚州欧美日韩中文视频| 日韩精品在线免费播放| 国产a∨精品一区二区三区不卡| 日韩欧美综合在线视频| 国产成人一区二区三区小说| 亚洲成人网久久久| 亚洲国产一区二区三区在线观看| 午夜免费久久久久| 国产精品视频内| 久久久久久久久久久亚洲| 成人免费视频在线观看超级碰| 日韩三级成人av网| 日韩成人av在线| 日韩av成人在线| 日韩欧美在线视频观看| 日韩精品中文字幕在线| 欧美日韩中国免费专区在线看| 国模精品一区二区三区色天香| 色偷偷91综合久久噜噜| 欧美激情免费视频| 久久国产一区二区三区| 97人人做人人爱| 国语对白做受69| 亚洲国产日韩欧美在线99| 欧美成人黑人xx视频免费观看| 亚洲最大中文字幕| 国产91|九色| 久久精品国产视频| 成人国产精品一区二区| 欧美噜噜久久久xxx| 日韩一区二区av| 北条麻妃一区二区三区中文字幕| 色无极亚洲影院| 久久影院免费观看| 日本高清久久天堂| 久久国产精品久久国产精品| 中文字幕亚洲一区二区三区| 欧美黄色片免费观看| 欧美日韩国产色视频| 国产精品嫩草影院久久久| 欧美午夜美女看片| 欧美成人免费在线观看| 欧美日韩精品在线| 成人精品视频99在线观看免费| 国产精品久久久久一区二区| 九九热这里只有精品免费看| 国产欧美 在线欧美| 97超碰国产精品女人人人爽| 亚洲一区二区三区乱码aⅴ蜜桃女| 懂色aⅴ精品一区二区三区蜜月| 成人美女免费网站视频| 久久影视电视剧免费网站清宫辞电视| 91在线国产电影| www.亚洲男人天堂| 日韩精品在线免费观看视频| 国产91精品久久久| 国产精品免费福利| 91超碰caoporn97人人| 日韩电影免费观看在线| 欧美激情图片区| 亚洲图片欧洲图片av| 久久久免费高清电视剧观看| 成人国内精品久久久久一区| 欧美黄色www| 91美女片黄在线观看游戏| 久久久久国色av免费观看性色| 欧美在线视频网站| 亚洲小视频在线观看| 久热精品视频在线观看| 成人h猎奇视频网站| 日韩极品精品视频免费观看| 国产精品老牛影院在线观看| 日韩欧美一区二区三区| 午夜精品久久久久久久久久久久|