遇到此问题的背景:项目需要实现单点登录,在前后端分离的前提下,前台如何保存token值成为了一个问题。想到的解决方案是,将token值统一存到一个前端程序,其他的前端程序去这个前端程序去取token(其他更好的解决方案欢迎指导~~)。在项目用angular的情况下,选择了以下插件:angular-cross-storage,此插件可以实现跨域存取localStorage,操作非常简单,github地址:https://github.com/fealaer/angular-cross-storage,都有demo。

通常情况下,设置HTTP的authorization只需在congfig中进行如下配置:

var app = angular.module("myApp",[]); 
app.config(function($httpProvider) {   $httpProvider.defaults.headers.common["Authorization"] = 所需带的权限; });

但是在此处,权限值是存在另一个前端程序的token值,获取权限token值是异步请求,并不能确定在何时能完成,说不定还没得到token值,页面已经发出了http请求,而这个没设置Authorization的请求,势必会返回401。

So 先要设置一个拦截器,并在拦截器里设置请求头,代码如下:

var app = angular.module("myApp",[
'angular-cross-storage'
]);
// 拦截器服务
   app.factory("HttpInterceptor", function ($q, tokenService) {
        var HttpInterceptor = {
            request: function(config){
                var deferred = $q.defer();
                tokenService.getTokenEvents().then(function(res) {  // 从另一个前端程序获取token
                    config.headers["Authorization"] = "bearer " + res.value; // 设置Authorization
                    deferred.resolve(config);
                }).catch(function (err) {
                    // do something...
                    deferred.resolve(config);
                });
                return deferred.promise;

            },
            requestError: function(err){
                return $q.reject(err);
            },
            response: function(res){
                console.log(res);
                return res;
            },
            responseError: function(err){
                if(-1 === err.status) {
                    console.log(-1);
                    // 远程服务器无响应
                } else if(500 === err.status) {
                    // 处理各类自定义错误
                } else if(401 === err.status) {

                }
                return $q.reject(err);
            }
        };
        return HttpInterceptor;
    })

 拦截器依赖一个对token操作的服务“tokenService", 代码如下:

// token的存取及清除
   app.factory("tokenService", function (CrossDomainStorage) {  // CrossDomainStorage 是angular-cross-storage 的一个服务
        var setToken = function (access_token) {
            return CrossDomainStorage.set("access_token",access_token)
        };
        var setTokenType = function (token_type) {
            return CrossDomainStorage.set("token_type", token_type)
        };
        var getToken = function () {
            return CrossDomainStorage.get('access_token')
        };
        var clearToken = function () {
            return CrossDomainStorage.clear()
        };
        return {
            setTokenEvents: function (access_token) {
                return setToken(access_token)
            },
            setTokenTypeEvents: function (token_type) {
                return setTokenType(token_type)
            },
            getTokenEvents: function () {
                return getToken();
            },
            clearTokenEvents: function () {
                return clearToken();
            }
        }
    })

  然后在config中配置拦截器, 代码如下:

app.config(function ($httpProvider,CrossDomainStorageProvider) {
        $httpProvider.interceptors.push('HttpInterceptor');
    })

  就大功告成了,页面发起的请求都会带上 从另一前端程序取过来的 token值权限头

在Angular中,如果权限值是异步请求所得,如何将其设置为HTTP请求头的Authorization?的更多相关文章

  1. angular中的$q.defer()服务异步处理

    jquery和angular都有defer服务,我暂以angular为例谈谈我的理解,最后并附上jquery的阮一峰总结的defer. 以我目前项目的部分代码为例说明为什么要用deferred. fu ...

  2. angular源码分析:angular中$rootscope的实现——scope的一生

    在angular中,$scope是一个关键的服务,可以被注入到controller中,注入其他服务却只能是$rootscope.scope是一个概念,是一个类,而$rootscope和被注入到cont ...

  3. Angular中的jsonp

    1.一般我们使用Angualr中的jsonp值这样使用的:注入$http服务 这样使用jsonp的方式可以支持多数api,但是douban不支持无法使用 module.controller('InTh ...

  4. 形象的讲解angular中的$q与promise(转)

    以下内容摘自http://www.ngnice.com/posts/126ee9cf6ddb68 promise不是angular首创的,作为一种编程模式,它出现在……1976年,比js还要古老得多. ...

  5. angular中的promise

    angular中的promise用法 标签(空格分隔): angular 前言 Promise其实是一个规范,用类似then().then()这样的链式调用形式来处理因为异步带来意大利面条式的代码(多 ...

  6. 【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例

    目录 一. 划重点 二. Angular应用中的Http请求 三. 使用Rxjs构建Http请求结果的处理管道 3.1 基本示例 3.2 常见的操作符 四. 冷热Observable的两种典型场景 4 ...

  7. angular 2+ 变化检测系列三(Zone.js在Angular中的应用)

    在系列一中,我们提到Zone.js,Zones是一种执行上下文,它允许我们设置钩子函数在我们的异步任务的开始位置和结束位置,Angular正是利用了这一特性从而实现了变更检测. Zones.js非常适 ...

  8. angular中的表单数据自定义验证

    之前说过了angular是如何给表单的数据进行基本的,常用的验证的:angular学习笔记(二十)-表单验证 但是在实际工作中,这些验证是远远不够的,很多时候我们需要自定义一些验证规则,以及一些异步, ...

  9. Angular中的$q的形象解释及深入用法

    作者:寸志链接:https://zhuanlan.zhihu.com/p/19622332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 早上,老爸说:“儿子,天气如何 ...

随机推荐

  1. SSO单点登录设计

    关键字: 单点登录 SSO Session 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用 ...

  2. PHP与MySql建立连接

    通过PHP脚本建立与一个MySQL数据库的连接时,数据库服务器的主机位置(在本地就是localhost).用户名(root).密码.和数据库名是必须的.一旦建立连接,脚本就能执行SQL命令.二者联系的 ...

  3. PHP 中 static 和 self 的区别

    使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类: 使用 static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的.也可以称之为" ...

  4. 添加Pods依赖

    1. 添加所需文件 1.1. 添加 .podspec 文件 1.1.1.  创建 必须文件 使用命令 pod spec create name.podspec 或者直接拷贝一份 1.1.2.  添加内 ...

  5. 冒泡排序法-java案例详解

    /** * 功能:冒泡排序法 * 思想:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码, * ,若发现逆序这交换,使得排序码较小的元素逐渐从后部移向前部(从下标较大的单元移 ...

  6. Delphi遍历文件夹及子文件夹(可查找固定格式文件)

    Delphi遍历文件夹及子文件夹 {-------------------------------------------------------------------------------过程名 ...

  7. 转对象(含length属性)成数组Array.prototype.slice.call(arguments)

    我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js ...

  8. HTML 5 简介、视频、Video + DOM、音频、拖放

    HTML5 是下一代的 HTML. 什么是 HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web ...

  9. Flex timer使用 keydown事件注册到stage

    Flex timer使用 keydown事件注册到stage: <?xml version="1.0" encoding="utf-8"?> < ...

  10. Xpath语法格式整理

    http://www.cnblogs.com/Loofah/archive/2012/05/10/2494036.html 经常在工作中会使用到XPath的相关知识,但每次总会在一些关键的地方不记得或 ...