在Angular中,如果权限值是异步请求所得,如何将其设置为HTTP请求头的Authorization?
遇到此问题的背景:项目需要实现单点登录,在前后端分离的前提下,前台如何保存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?的更多相关文章
- angular中的$q.defer()服务异步处理
jquery和angular都有defer服务,我暂以angular为例谈谈我的理解,最后并附上jquery的阮一峰总结的defer. 以我目前项目的部分代码为例说明为什么要用deferred. fu ...
- angular源码分析:angular中$rootscope的实现——scope的一生
在angular中,$scope是一个关键的服务,可以被注入到controller中,注入其他服务却只能是$rootscope.scope是一个概念,是一个类,而$rootscope和被注入到cont ...
- Angular中的jsonp
1.一般我们使用Angualr中的jsonp值这样使用的:注入$http服务 这样使用jsonp的方式可以支持多数api,但是douban不支持无法使用 module.controller('InTh ...
- 形象的讲解angular中的$q与promise(转)
以下内容摘自http://www.ngnice.com/posts/126ee9cf6ddb68 promise不是angular首创的,作为一种编程模式,它出现在……1976年,比js还要古老得多. ...
- angular中的promise
angular中的promise用法 标签(空格分隔): angular 前言 Promise其实是一个规范,用类似then().then()这样的链式调用形式来处理因为异步带来意大利面条式的代码(多 ...
- 【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例
目录 一. 划重点 二. Angular应用中的Http请求 三. 使用Rxjs构建Http请求结果的处理管道 3.1 基本示例 3.2 常见的操作符 四. 冷热Observable的两种典型场景 4 ...
- angular 2+ 变化检测系列三(Zone.js在Angular中的应用)
在系列一中,我们提到Zone.js,Zones是一种执行上下文,它允许我们设置钩子函数在我们的异步任务的开始位置和结束位置,Angular正是利用了这一特性从而实现了变更检测. Zones.js非常适 ...
- angular中的表单数据自定义验证
之前说过了angular是如何给表单的数据进行基本的,常用的验证的:angular学习笔记(二十)-表单验证 但是在实际工作中,这些验证是远远不够的,很多时候我们需要自定义一些验证规则,以及一些异步, ...
- Angular中的$q的形象解释及深入用法
作者:寸志链接:https://zhuanlan.zhihu.com/p/19622332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 早上,老爸说:“儿子,天气如何 ...
随机推荐
- 查找 SqlServer死锁
use master if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') ) dr ...
- 非root用户Memcached repcached安装
安装memcached前先要确定系统是否安装了gcc: 1.解压安装包: tar -zxf memcached-1.2.8-repcached-2.2.tar.gz 2.编译: 系统应安装了libev ...
- Sublime text追踪函数插件
Sublime Text2/3怎样在Ubuntu中配置CTags插件 | 浏览:1278 | 更新:2014-03-05 10:34 1 2 3 4 5 6 7 分步阅读 本文详解在Ubuntu Li ...
- 如何解决ADT17下Android第三方jar包NoClassDefFoundError的错误
转自:http://blog.csdn.net/huzgd/article/details/7604069本人已试过第二种解决方法可行!! 原文:Posted by Foxykeep on 22/03 ...
- CocoaPods ReactiveCocoa 学习实践一 之 配置环境
1.安装CocoaPods 1.00.参考 CocoaPods 文档 1.01.是否已安装 which pod 1.1.升级gem命令 sudo gem update --system 1.2.切换C ...
- word页眉页脚 首页 索引 正文各不同的处理方法
1.在目录和正文之间,加入分隔符——分节符——下一页,然后再添加页眉页脚,然后再添加索引:
- PHP 单态设计模式复习
单态设计模式,也可以叫做单例设计模式, 就是一个类只能让它生成一个对象,避免重复的NEW,影响运行效率(每NEW一个对象都会在内存中开辟一块空间) 示例代码 <?php /* * 单态设计模式 ...
- 【翻译】使用Visual Studio创建Asp.Net Core MVC (一)
This tutorial will teach you the basics of building an ASP.NET Core MVC web app using Visual Studio ...
- 第四组UI组件:AdapterView及子类
AdapterView组件是一组重要的组件,AdapterView本省是一个抽象基类,它派生的子类在用法上十分相似,只是显示界面与一定的区别,因此这次针对它们的共性集中讲解,并突出介绍他们的区别. A ...
- PHP上传图片重命名6种方案
一. 适用场景:无法使用从数据库中返回的自增长数字,给上传图片重命名.这是图片或文件上传的流程决定的.一般图片上传处理过程是,先上传图片到服务器,重命名之后,插入到数据库.也就是说,在数据库中非常容易 ...