2017-08-09 10 views
2

Angular 4.3プロジェクトには、パブリックサイトコンポーネントとセキュリティで保護されたサイト(ログイン済み)コンポーネントが別々に用意されています。我々は@angular/common/httpを使用します。我々は、public-siteコンポーネントとsecured-siteコンポーネントに対して異なるhttpインターセプタを実装したいと考えています。例えば、角4.3でHttpClientの2つのインスタンス(2つのインターセプタと1つのインターセプタを持つもの)を使用するにはどうすればよいですか?

  1. 公開サイト成分は - のみインターセプタ
    LoggingInterceptor
  2. 固定サイトの部品の下に適用する - 要求ヘッダーに認証トークンを渡すために、2つのインターセプタ
    LoggingInterceptor
    AuthTokenInterceptor(下に適用します)

各コンポーネントレベルでプロバイダの詳細HTTP_INTERCEPTORSを追加しようとしました@Componentと異なるインターセプタを使用します。しかし、要求はいずれのインターセプタにも入っていません。

@NgModuleにプロバイダの詳細HTTP_INTERCEPTORSを追加した場合にのみ、リクエストがインターセプタに送信されます。ここで問題となるのは、パブリックサイトのHTTP要求もAuthTokenInterceptorに入りますが、これは不要です。

これをどのように解決する必要がありますか?ありがとう。

答えて

1

HttpClientの2つのインスタンスは、各HTTPリクエストでインターセプタが何度も何度も繰り返し適用される必要はありません。

私のアプリの状態をどのように処理しているかわからないのは、現在のリクエストを突然変異しているかどうかを判断するインターセプタに何らかの条件を入れることができるということに基づいています。この方法では、要求がpublic-site componentsからトリガーされている場合は、Authorizationヘッダーが添付されません。例えば:

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); 
    } 

    } 

ちょうどその上のフィルタを設定するreq.urlを使用して、特定のapi/urlからAuthorizationヘッダを送信したくない場合は

+0

ありがとう@Kuncevic。パブリックサイトのコンポーネント要求を区別するための条件を見つけます。しかし、@ Componentレベル(@ NgModuleから削除)にHTTP_INTERCEPTORSプロバイダを追加し、そのコンポーネントのngOnInitメソッド内でhttp呼び出しを行うと、インターセプタが呼び出されないという疑問があります。同じコード行(プロバイダ)を@ NgModuleに移動すると、インターセプタが動作しています。 HTTP_INTERCEPTORSプロバイダはNgModuleでのみ設定する必要がありますか? – Samy

+0

これは依存性注入の仕組みです。あなたの 'public-site'と' secured-site'を 'modules'を分けて置いても、明らかに' app.module'で宣言し、 'public-site.module'であなたに言う必要があります'interceptor1'と' secured-site.module'で 'interceptor1'と' interceptor2'を指定すると、 'interceptor1'を2回呼び出すことになります。しかし、各遅延ロードモジュールが独自のインジェクションツリーを持っているので、各モジュールを遅延ロードするようにすると、そうした場合にプロバイダが干渉しません。 – Kuncevic

+0

しかし、私はあなたの問題を '遅延読み込み'モジュールを '遅延読み込み'として別の目的に役立てることを推奨しません。あなたの 'lazy laded'モジュールのそれぞれに' httpインターセプタ '/' provider 'の異なるセットを適用するために 'lazy loading'を使うのはお勧めできません。 – Kuncevic

関連する問題