angular - 如何在 Angular 4.3 中使用 HttpClient 的两个实例(一个有 2 个拦截器,另一个有 1 个拦截器)?

标签 angular http-headers angular-http-interceptors

在我们的 Angular 4.3 项目中,我们分别拥有公共(public)站点组件和安全站点(登录)组件。我们使用@angular/common/http。我们希望为 public-site 组件和 secured-site 组件实现不同的 http 拦截器。例如,

  1. 公共(public)站点组件 - 仅适用于拦截器下面
    日志拦截器
  2. 安全站点组件 - 应用以下两个拦截器
    日志拦截器
    AuthTokenInterceptor(在请求 header 中传递身份验证 token )

我们尝试使用不同的拦截器在每个组件级别 @Component 添加提供程序详细信息 HTTP_INTERCEPTORS。但请求不会进入任何拦截器。

仅当我们在 @NgModule 中添加提供者详细信息 HTTP_INTERCEPTORS 时,请求才会进入拦截器。这里的问题是,公共(public)站点http请求也会进入不需要的AuthTokenInterceptor

那么我们应该如何解决这个问题呢?谢谢。

最佳答案

您不需要两个 HttpClient 实例作为拦截器在每个 http 请求上反复应用。

我不知道您如何处理我们应用程序的状态,基于此您只需在拦截器中添加一些条件,该条件将决定当前请求是否发生变化。这样,如果请求是从公共(public)站点组件触发的,则不会附加授权 header 。例如:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if ('your condition here if public-site components') {
        // Just return original request
        return next.handle(req);
    } else {
        // Here return modified one
        // Get the auth header from the service.
        const authHeader = this.auth.getAuthorizationHeader();
        // Clone the request to add the new header.
        const authReq = req.clone({headers: req.headers.set('Authorization', authHeader)});
        // Pass on the cloned request instead of the original request.
        return next.handle(authReq);
     }

   }

如果您不想将 Authorization header 发送到特定的 api/url,只需使用 req.url 对其设置过滤器。

关于angular - 如何在 Angular 4.3 中使用 HttpClient 的两个实例(一个有 2 个拦截器,另一个有 1 个拦截器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45580318/

相关文章:

Angular :HttpInterceptor 没有捕捉到每个请求

Angular 4.3 拦截器 - 如何使用?

javascript - 如何在 Angular 2中设置或删除当前路由中的queryParams而不重新加载页面

javascript - 我的 Angular 应用程序中 BehaviorSubject 的混淆行为

angular - 在 angular 2 组件中使用 rxjs,我应该手动导入运算符吗?

c# - 获取 Request.Headers 值

angular - 什么是 Angular 平台浏览器?

http - 使用 gzip 编码数据时应该发送多长的内容?

php - 什么时候发送 HTTP 状态码?

angular - 如何在导出的函数中禁用拦截器?