【问题标题】:How to bypass the addition of headers in custom auth HttpInterceptor using HttpClient in angular?如何绕过在自定义身份验证 HttpInterceptor 中使用 HttpClient 在 Angular 中添加标头?
【发布时间】:2017-09-04 05:42:37
【问题描述】:

我创建了一个实现 HttpInterceptor 的自定义身份验证拦截器。我将为使用 httpClient 发出的每个请求添加标头。 现在我有几个不需要添加身份验证标头的请求。

下面是我的自定义拦截器的代码供参考

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

  constructor(private franchiserService: FranchiserService,
              private currentMerchantService: CurrentMerchantService) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {

    console.log('Request Intercepted');

    const franchiserKey = this.franchiserService.franchiser.apiKey;
    const merchantKey = this.currentMerchantService.merchant.apiKey;

    const authReq = req.clone({
      headers: req.headers.append('franchiserKey', franchiserKey).append('merchantKey', merchantKey),
      url: environment.origin + req.url
    });

    return next.handle(authReq);
  }

}

我如何实现自定义拦截器,它可以做到这两点?

【问题讨论】:

  • 我不确定如果没有一些 hack 是否可行,因为我猜 http 拦截器的设计不是那样
  • 好吧,测试一下这个请求是不是这几个请求之一,如果是假的就加头,真就不要加。
  • @JBNizet 我有 4 到 5 个不需要标头的请求,用 if-else 实现不是粗略的方法吗?
  • 粗不粗,你还有什么选择?
  • 好的。我将使用 if-else。谢谢。

标签: angular


【解决方案1】:

您可以通过在服务中添加自己的 http 处理程序类型 (在 https://angular.io/api/common/http/HttpHandler 的角度文档中检查处理程序类型)来绕过 Angular 中的全局身份验证标头。不需要拦截

import { HttpClient, HttpBackend } from @angular/common/http;

 constructor(private http: HttpClient, private handler: httpBackend ) {
     this.http = new HttpClient(handler); // provide handler of type HttpBackend   }

添加这个 HttpBackend 类型的处理程序将告诉它绕过所有其他处理程序并移至最后一个处理程序。角度中的身份验证拦截通常按照添加身份验证拦截器的顺序发生,最后在 HttpBackend 处结束。像这样直接添加会跳过所有拦截

【讨论】:

猜你喜欢
  • 2018-08-05
  • 2011-12-03
  • 2019-11-03
  • 2020-09-27
  • 2017-08-06
  • 2018-07-18
  • 2019-04-09
  • 2019-06-19
  • 2014-04-29
相关资源
最近更新 更多