浅析AngularJs HTTP响应拦截器


Posted in Javascript onDecember 28, 2015

为何要用拦截器?

任何时候,如果我们想要为请求添加全局功能,例如身份认证、错误处理等,在请求发送给服务器之前或服务器返回时对其进行拦截,是比较好的实现手段。

 angularJs通过拦截器提供了一个从全局层面进行处理的途径.

 拦截器允许你:

通过实现 request 方法拦截请求: 该方法会在 $http 发送请求道后台之前执行,因此你可以修改配置或做其他的操作。该方法接收请求配置对象(request configuration object)作为参数,然后必须返回配置对象或者 promise 。如果返回无效的配置对象或者 promise 则会被拒绝,导致 $http 调用失败。

通过实现 response 方法拦截响应: 该方法会在 $http 接收到从后台过来的响应之后执行,因此你可以修改响应或做其他操作。该方法接收响应对象(response object)作为参数,然后必须返回响应对象或者 promise。响应对象包括了请求配置(request configuration),头(headers),状态(status)和从后台过来的数据(data)。如果返回无效的响应对象或者 promise 会被拒绝,导致$http 调用失败。

通过实现 requestError 方法拦截请求异常: 有时候一个请求发送失败或者被拦截器拒绝了。请求异常拦截器会俘获那些被上一个请求拦截器中断的请求。它可以用来恢复请求或者有时可以用来撤销请求之前所做的配置,比如说关闭进度条,激活按钮和输入框什么之类的。

通过实现 responseError 方法拦截响应异常: 有时候我们后台调用失败了。也有可能它被一个请求拦截器拒绝了,或者被上一个响应拦截器中断了。在这种情况下,响应异常拦截器可以帮助我们恢复后台调用。

 拦截器的核心是服务工厂,通过向$httpprovider.interceptors数组中添加服务工厂。在$httpProvider中进行注册。

 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; 
}

然后使用$httpProvider在.config()函数中注册拦截器

angular.module("myApp", []) 
.config([ '$httpProvider', function($httpProvider) { 
  $httpProvider.interceptors.push('httpInterceptor'); 
} ]);

  实际的例子:(对401、404的拦截)

routerApp.config([ '$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push('httpInterceptor'); 
  } ]); 
  routerApp.factory('httpInterceptor', [ '$q', '$injector',function($q, $injector) { 
    var httpInterceptor = { 
      'responseError' : function(response) { 
        if (response.status == 401) { 
          var rootScope = $injector.get('$rootScope'); 
          var state = $injector.get('$rootScope').$state.current.name; 
          rootScope.stateBeforLogin = state; 
          rootScope.$state.go("login"); 
          return $q.reject(response); 
        } else if (response.status === 404) { 
          alert("404!"); 
          return $q.reject(response); 
        } 
      }, 
      'response' : function(response) { 
        return response; 
      } 
    } 
    return httpInterceptor; 
  }  
]);

Session 注入(请求拦截器)

这里有两种方式来实现服务端的认证。第一种是传统的 Cookie-Based 验证。通过服务端的 cookies 来对每个请求的用户进行认证。另一种方式是 Token-Based 验证。当用户登录时,他会从后台拿到一个 sessionToken。sessionToken 在服务端标识了每个用户,并且会包含在发送到服务端的每个请求中。

下面的 sessionInjector 为每个被俘获的请求添加了 x-session-token 头 (如果当前用户已登录):

<!-- lang: js -->
module.factory('sessionInjector', ['SessionService', function(SessionService) {
  var sessionInjector = {
    request: function(config) {
      if (!SessionService.isAnonymus) {
        config.headers['x-session-token'] = SessionService.token;
      }
      return config;
    }
  };
  return sessionInjector;
}]);
module.config(['$httpProvider', function($httpProvider) {
  $httpProvider.interceptors.push('sessionInjector');
}]);

然后创建一个请求:

<!-- lang: js -->
$http.get('https://api.github.com/users/naorye/repos');

被 sessionInjector 拦截之前的配置对象是这样的:

<!-- lang: js -->
{
  "transformRequest": [
    null
  ],
  "transformResponse": [
    null
  ],
  "method": "GET",
  "url": "https://api.github.com/users/naorye/repos",
  "headers": {
    "Accept": "application/json, text/plain, */*"
  }
}

被 sessionInjector 拦截之后的配置对象是这样的:

<!-- lang: js -->
{
  "transformRequest": [
    null
  ],
  "transformResponse": [
    null
  ],
  "method": "GET",
  "url": "https://api.github.com/users/naorye/repos",
  "headers": {
    "Accept": "application/json, text/plain, */*",
    "x-session-token": 415954427904
  }
}

以上内容给大家介绍了AngularJs HTTP响应拦截器的相关知识,希望本文分享能够给大家带来帮助。

Javascript 相关文章推荐
javascript 防止刷新,后退,关闭
Aug 07 Javascript
jquery+css+ul模拟列表菜单具体实现思路
Apr 15 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
Mar 23 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
Jan 07 Javascript
学习使用bootstrap的modal和carousel
Dec 09 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
Dec 14 Javascript
Jquery把获取到的input值转换成json
May 15 jQuery
基于bootstrap写的一点localStorage本地储存
Nov 21 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
Jun 28 Javascript
vue mounted 调用两次的完美解决办法
Oct 29 Javascript
JS数组方法reverse()用法实例分析
Jan 18 Javascript
Vue+Element-U实现分页显示效果
Nov 15 Javascript
Bootstrap实现默认导航栏效果
Sep 21 #Javascript
Angularjs注入拦截器实现Loading效果
Dec 28 #Javascript
AngularJS进行性能调优的7个建议
Dec 28 #Javascript
浅析AngularJS Filter用法
Dec 28 #Javascript
jquery实现倒计时功能
Dec 28 #Javascript
基于jquery实现瀑布流布局
Jun 28 #Javascript
详解AngularJS Filter(过滤器)用法
Dec 28 #Javascript
You might like
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
php 缩略图实现函数代码
2011/06/23 PHP
php解析xml方法实例详解
2015/05/12 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
jQuery实现的多滑动门,多选项卡效果代码
2016/03/28 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
Three.js快速入门教程
2016/09/09 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
关于在mongoose中填充外键的方法详解
2017/08/14 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
2018/07/10 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
Python实现的Kmeans++算法实例
2014/04/26 Python
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
财务管理职业生涯规划范文
2013/12/27 职场文书
2014年基层党组织公开承诺书
2014/03/29 职场文书
医药营销个人求职信
2014/04/12 职场文书
九一八事变演讲稿
2014/09/05 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书