Angular4---认证---使用HttpClient拦截器,解决循环依赖引用的问题
在angular4 项目中,每次请求服务端需要添加头部信息AccessToken作为认证的凭据。但如果在每次调用服务端就要写代码添加一个头部信息,会变得很麻烦。可以使用angular4的HttpClient来拦截每个请求,然后在头部添加上信息。
直接上代码实践
一、创建拦截器Service,实现HttpInterceptor的intercept方法
import { Injectable, Injector} from '@angular/core';
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from '@angular/common/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/do';
import {AuthenticationService} from './auth/authentication.service'; // 用于获得AccessToken的服务类
import {environment} from '../../environments/environment';
/**
* HTTP拦截器,设置头部信息
*/
@Injectable()
export class BaseHttpInterceptorService implements HttpInterceptor {
authService: AuthenticationService;
skipAuth: [string];
constructor(private inject: Injector) {
// 用户登录或认证请求则不需要添加头部AccessToken信息
this.skipAuth = [
`${environment.serverUrl}/api/v1/User/login`,
];
}
/**
* 拦截器拦截请求
* @param {HttpRequest<any>} req
* @param {HttpHandler} next
* @returns {Observable<HttpEvent<any>>}
*/
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.authService = this.inject.get(AuthenticationService);// 注意此句
const req_started = Date.now();
let authReq;
/**
* 如果是跳过认证的链接,则不添加头部信息
*/
if (this.isSkipAuth(req.url)) {
authReq = req.clone();
}else {
const access_token = `Bearer ${this.authService.getAccessToken('563151811@qq.com')}`;
authReq = req.clone({
setHeaders: {
Authorization: access_token
}
});
}
return next.handle(authReq).do(event => {
if (event instanceof HttpResponse) {
const elapsed = Date.now() - req_started;
console.log(`Request for ${req.urlWithParams} took ${elapsed} ms`);
}
});
}
/*
*是否跳过添加头部认证
*/
isSkipAuth(url: string) {
let isMatch = false;
this.skipAuth.forEach((reg_url: string) => {
if ( !isMatch) {
if (url.search(reg_url) >= ) {
isMatch = true;
}
}
});
return isMatch;
}
}
二、注册拦截器,在APPModule中,添加如下代码
{
provide: HTTP_INTERCEPTORS,
useClass: BaseHttpInterceptorService,// 上边定义的拦截器名字
multi: true
},
三、每个请求服务端数据的Service依赖HttpClient,而不是http。
那么一个基础的拦截器已经完成了,但是,你会发现调用认证服务Service的时候,会报错:Cyclic dependency error with HttpInterceptor ,如果添加了第一步代码中注意点那段代码后,又会发现OK了。
这是依赖注入循环嵌套:A依赖B,B中又引用A。
官方文档中采用forwardRef,但是发现没用。在Stack Overflow中看到有人采用上述方法成功解决问题。https://github.com/angular/angular/issues/18224
如需要更详细的代码或有问题,请联系我
Angular4---认证---使用HttpClient拦截器,解决循环依赖引用的问题的更多相关文章
- 从一个舒服的姿势插入 HttpClient 拦截器技能点
马甲哥继续写一点大前端,阅读耗时5 minute,行文耗时5 Days 今天我们来了解一下如何拦截axios请求/响应? 这次我们举一反三,用一个最舒适的姿势插入这个技能点. axios是一个基于 p ...
- 浅谈Spring解决循环依赖的三种方式
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
- 彻底理解Spring如何解决循环依赖
Spring bean生命周期 可以简化为以下5步. 1.构建BeanDefinition 2.实例化 Instantiation 3.属性赋值 Populate 4.初始化 Initializati ...
- Spring 如何解决循环依赖问题?
在关于Spring的面试中,我们经常会被问到一个问题,就是Spring是如何解决循环依赖的问题的. 这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能 ...
- Spring如何解决循环依赖问题
目录 1. 什么是循环依赖? 2. 怎么检测是否存在循环依赖 3. Spring怎么解决循环依赖 本文主要是分析Spring bean的循环依赖,以及Spring的解决方式. 通过这种解决方式,我们可 ...
- Spring解决循环依赖
1.Spring解决循环依赖 什么是循环依赖:比如A引用B,B引用C,C引用A,它们最终形成一个依赖环. 循环依赖有两种 1.构造器循环依赖 构造器注入导致的循环依赖,Spring是无法解决的,只能抛 ...
- Spring ioc(4)---如何解决循环依赖
前面说到对象的创建,那么在创建的过程中Spring是怎么又是如何解决循环依赖的呢.前面提到有个三级缓存.就是利用这个来解决循环依赖.打个比方说实例化A的时候,先将A创建(早期对象)放入一个池子中.这个 ...
- Spring中解决循环依赖报错的问题
什么是循环依赖 当一个ClassA依赖于ClassB,然后ClassB又反过来依赖ClassA,这就形成了一个循环依赖: ClassA -> ClassB -> ClassA 原创声明 本 ...
- Spring 如何解决循环依赖的问题
Spring 如何解决循环依赖的问题 https://blog.csdn.net/qq_36381855/article/details/79752689 Spring IOC 容器源码分析 - 循环 ...
随机推荐
- TensorFlow4Delphi
https://github.com/hartmutdavid/TensorFlow4Delphi
- C# winform中Show()和ShowDialog()的区别
项目实际开发中需要根据不同的应用场景利用Show和ShowDialog,尤其是三级弹窗,慎用ShowDialog,否则会导致关闭第三级窗体时,自动关闭第二级,解决方案就是在第一级窗体弹出时采用Show ...
- Java爬虫----有道翻译初步
目标:http://fanyi.youdao.com/ 用爬虫实现翻译功能. 利用f12查看网页Network,可以发现 有关翻译的表单请求通过 http://fanyi.youdao.com/tr ...
- FFmepg 如何在 window 上使用?
下载FFmepg官网库直接使用即可. avdevice.lib avcodec.lib avfilter.lib avformat.lib avutil.lib postproc.lib swresa ...
- 编码问题 php字符编码转换类
各种平台和软件打开显示的编码问题,需要使用不同的编码,根据我们不同的需求. php 字符编码转换类,支持ANSI.Unicode.Unicode big endian.UTF-8.UTF-8+Bom ...
- hive:框架理解
1. 什么是hive •Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. •本质是将HQL转换为MapReduce程序 2. 为什么 ...
- Array.reduce()学习
昨天遇到的一道题:1234567890 => 1,234,567,890 要求其实就是使用逗号做千分位将数字进行分隔. 当时没想到任何方法,但是以前看到过,印象很深刻,今天就找了一下. 看到其实 ...
- Pokémon Go呼应设计:让全世界玩家疯狂沉迷
引言:什么样的呼应设计会让移动游戏玩家沉迷?那必须为玩家构建一个属于玩家本人或者被玩家认可的虚拟环境,或者说是被玩家认可的虚拟世界.在移动游戏时代,想要做到这一点并不容易.但Pokémon Go却做到 ...
- R语言︱缺失值处理之多重插补——mice包
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:缺失值是数据清洗过程中非常重要的问题 ...
- freemarker之include指令
freemarker之include指令 1.父页面ftl <html> <head> <meta http-equiv="content-type" ...