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(‘[email protected]‘)}`;
      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) >= 0) {
          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

如需要更详细的代码或有问题,请联系我

原文地址:https://www.cnblogs.com/kingkangstudy/p/8534272.html

时间: 2024-08-29 23:30:26

Angular4---认证---使用HttpClient拦截器,解决循环依赖引用的问题的相关文章

拦截器报循环依赖错误

拦截器 @Slf4j @Component public class LcOpPermissionInterceptor extends HandlerInterceptorAdapter { ...... } 将拦截器注入适配器中 @Configuration public class LcOpWebMvcConfigurer extends WebMvcConfigurerAdapter { @Autowired private LcOpPermissionInterceptor lcOpP

拦截器解决乱码问题

拦截器解决乱码问题 过滤器用法: @WebFilter(filterName="nn",urlPatterns="/*") public class myfilter implements Filter{ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletExcep

spring解决循环依赖

之前面试有被问到过,面试官很调皮,我擅长的点没有问,然后抽了一个点让我回答,这个点考察了源码的理解,当时只是大概记得是提前暴露,但是细节答得有些粗糙,特补充一下,,, protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == nul

Spring 如何解决循环依赖的问题

Spring 如何解决循环依赖的问题 https://blog.csdn.net/qq_36381855/article/details/79752689 Spring IOC 容器源码分析 - 循环依赖的解决办法 https://www.imooc.com/article/34150 原文地址:https://www.cnblogs.com/tonggc1668/p/11751384.html

spring怎么解决循环依赖

spring怎么解决循环依赖?首先会根据 beanName 从单例 bean 缓存中获取,如果不为空则直接返回 主要是从三个缓存中获取 (称他们为3级缓存),分别是: singletonObjects (1 单例对象的cache) earlySingletonObjects(2 提前暴光的单例对象的Cache ) singletonFactories (3 单例对象工厂的cache )getSingleton() 整个过程如下: 首先从一级缓存 singletonObjects 获取,如果没有且

Spring 循环引用(三)AbstractFactoryBean 如何解决循环依赖

目录 Spring 循环引用(三)AbstractFactoryBean 如何解决循环依赖 1. 循环依赖问题 2. 准备实验 3. 原因分析 4. 解决方案 5. 还有什么问题 6. 总结 Spring 循环引用(三)AbstractFactoryBean 如何解决循环依赖 Spring 系列目录:https://www.cnblogs.com/binarylei/p/10198698.html 本章讨论的范围:AbstractFactoryBean 创建单例 Bean 过程中出现的循环依赖问

8.Struts2拦截器

1. 拦截器的概述 * 拦截器就是AOP(Aspect-Oriented Programming)的一种实现.(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.) * 过滤器:过滤从客服端发送到服务器端请求的 * 拦截器:拦截对目标Action中的某些方法进行拦截 * 拦截器不能拦截JSP * 拦截到Action中某些方法 2. 拦截器和过滤器的区别 1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的 2)过滤器依赖于Servlet容器,而拦截器不依赖于

finally的用法,拦截器是Struts2的核心,异常处理

1.finally的用法:public static int getA(){    try{        String a = "123";        s.equals("123");        return 3;    }catch(Exception e){        return 4;    }finally{        return 5;//无论异常有没有,finally一定要执行    }}public static void main(

【WebService】CXF拦截器的设置以及自定义CXF拦截器

WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义WebService服务及其调用 [WebService]wsdl配置详解以及使用注解修改wsdl配置 [WebService]CXF处理javaBean等复合类型以及Map等复杂类型的数据 CXF的拦截器和以前学过的servlet的拦截器类似的,都是在开始或结束切入一段代码,执行一些逻辑之类的.我们可以在调用ws服务前设置拦截器,也可以在调用ws服务后设置拦截器,当然了,拦