在需要进行身份验证时,在请求发送给服务器之前或者从服务器返回时对其进行拦截,是比较好的实现手段。

例如,对于身份验证,如果服务器返回401状态码,将用户重定向到登录页面。

AngularJS通过拦截器提供了一个从全局层面对响应进行处理的途径。

拦截器是$http服务的基础中间件,用来向应用的业务流程中注入新的逻辑。

一共有四种拦截器,两种成功,两种失败。

request AngularJS通过$http设置对象来对请求拦截器进行调用。

response

requestError

responseError

通过两个步骤来使用拦截器:

在.factory()方法中创建拦截器,然后使用$httpProvider在.config()中注册拦截器:

angular.module("myApp", [])

.factory("myInterceptor", function($q) {

var interceptor = {}; return interceptor; }); //第一步

angular.module("myApp", [])

.config( function($httpProvider) {

$httpProvider.interceptors.push("myInterceptor"); }); //第二步

设置$httpProvider

使用.config()可以向所有请求中添加特定的HTTP头,这对于我们身份验证的时候非常有用。默认的请求头保存在$httpProvider.defaults.headers.common对象中,默认形式如下

Accept: application/json, text/plain, */*

通过.config()函数可以对这些头进行修改或扩充

angular.module("myApp", [])

.config(function($httpProvider) {

$httpProvider.defaults.headers.common['X-Requested-By'] = "MyAngularApp"; });

也可以在运行时通过$http对象的defaults属性对这些默认值进行修改,例如

$http.defaults.common['X-Auth'] = "RandomString";

有时候只需要对post类型请求进行设置,默认的post请求头是

Content-Type: application/json

可以在.config()函数中对post请求的头进行修改或扩充

angular.module("myApp", [])

.config(function($httpProvider) { $httpProvider.defaults.headers.post['X-Posted-By'] = "MyAngularApp"; });

在一篇叫做《Interceptors in AngularJS and Useful Examples By Naor Yehudaey》的文章中有一个例子用以实现服务端的认证,这种方式叫做Token-Based验证,当用户登录的时候,会从后台拿到一个sessionToken,sessionToken在服务端标识了每个用户,并且会包含在发送服务端的每个请求中。

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

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"); }]);

然后创建一个请求:

$http.get("url");

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

{ "transformRequest": [null],"transformResponse": [null], "method": "GET", "url": url, "headers": {"Accept": "application/json, text/plain, */*" } }

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

{"transformRequest": [null], "transformResponse": [null], "method": "GET", "url": url, "headers": {"Accept": "application/json, text/plain, */*", "x-session-token": 415954427904 } }

AngularJS 拦截器的更多相关文章

  1. AngularJS 拦截器和应用例子(转)

    $httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...

  2. AngularJS 拦截器和好棒例子

    目录[-] 什么是拦截器? 异步操作 例子 Session 注入(请求拦截器) 时间戳(请求和响应拦截器) 请求恢复 (请求异常拦截) Session 恢复 (响应异常拦截器) 总结 Intercep ...

  3. AngularJS 拦截器实现全局$http请求loading效果

    日常项目开发中,当前端需要和后端进行数据交互时,为了友好的UI效果,一般都会在前端加个loading的状态提示(包括进度条或者icon显示),数据传输或交互完成之后,再隐藏/删除loading提示. ...

  4. AngularJS拦截器

    AngularJS是通过拦截器提供了一个全局层面对响应进行处理的途径.拦截器实际是$http服务的基础中间件,用来向应用的业务流程中注入新的逻辑,其核心是服务工厂,通过向 $httpProvider. ...

  5. AngularJs 拦截器,拦截请求

    问题前述 我在项目中遇到这样一个问题: 在Angular项目中,会有很多需要用户点击操作的地方,如果用户点击过快会产生多次相同请求,会吃服务器带宽,如果这是其他涉及钱有关的操作,这会产生一个致命的问题 ...

  6. Angularjs中的拦截器 (卧槽,好牛逼)

    $httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...

  7. (转)Angular中的拦截器Interceptor

    什么是拦截器? 异步操作 例子 Session 注入(请求拦截器) 时间戳(请求和响应拦截器) 请求恢复 (请求异常拦截) Session 恢复 (响应异常拦截器) 转之:http://my.osch ...

  8. 快速了解AngularJs HTTP响应拦截器

    任何时候,如果我们想要为请求添加全局功能,例如身份认证.错误处理等,在请求发送给服务器之前或服务器返回时对其进行拦截,是比较好的实现手段. angularJs通过拦截器提供了一个从全局层面进行处理的途 ...

  9. 【转】AngularJs HTTP请求响应拦截器

    任何时候,如果我们想要为请求添加全局功能,例如身份认证.错误处理等,在请求发送给服务器之前或服务器返回时对其进行拦截,是比较好的实现手段. angularJs通过拦截器提供了一个从全局层面进行处理的途 ...

随机推荐

  1. Nodejs与ES6系列1:变量声明

    1.声明变量 在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域.变量分为两类,全局(global)的和局部的.其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都 ...

  2. Baraja演示15种不同的洗牌特效

      实例演示 下载地址 实例代码 实例演示 实例代码 <div class="container"> <header class="clearfix&q ...

  3. 谈谈JavaScript类型检测

      javascript内置的类型检测机制并非完全可靠.比如typeof操作符,并不能准确的判断数据是哪个类型,比如:数组和对象就不能通过typeof来区分. typeof [] ==="o ...

  4. 最简单的tab切换

    JS: $(".con").eq(0).show();    $(".btn span").click(function(){        var num = ...

  5. SharePoint Online 创建门户网站系列之创建栏目

    前 言 SharePoint Online的栏目,简单描述即显示在首页上的各个模块信息,这里,我们主要介绍我们首页上的栏目,包括简介类型.新闻列表类型.图片类型: 下面,让我们开始在SharePoin ...

  6. Web自动化测试 Selenium 3/3 https的配置

    Https的信任问题处理 具体步骤如下(以demo为例) 1) ./ca.sh : 使用默认的服务器192.168.1.1的证书 ./ca.sh IP : 使用IP设置的证书 2) 以上运行后把 ge ...

  7. Android TextView走马灯效果

    布局: <TextView android:id="@+id/myTextView" android:layout_width="match_parent" ...

  8. 【C语言】外部函数和内部函数

    目录 [外部函数]  [内部函数] 1.外部函数  定义的函数能被本文件和其它文件访问(默认). 注:不允许有同名的外部函数. 2.内部函数  定义的函数只能被本文件访问,其它文件不能访问. 注:允许 ...

  9. 深入.net(多态二)

    代码优化技术: 通过“继承”技术,实现代码的复用,减少代码的编写量. 因为子类继承父类,拥有了父类所有对外公开“属性”和“方法”,所以,在系统中,完全可以由子类替代父类(里氏替换原则)!在替代的过程中 ...

  10. 【代码笔记】iOS-电影上的花絮,自动滚动

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...