61.2. コンテナー要求フィルター
概要 リンクのコピーリンクがクリップボードにコピーされました!
本セクションでは、コンテナー要求フィルターを実装して登録する方法を説明します。このフィルターは、サーバー (コンテナー) 側の受信要求メッセージをインターセプトするために使用されます。コンテナー要求フィルターは、サーバー側でヘッダーを処理するために使用されることが多く、あらゆる種類の汎用要求処理 (つまり、呼び出された特定のリソースメソッドから独立している処理) に使用できます。
さらに、コンテナーリクエストフィルターは、PreMatchContainerRequest (リソース一致ステップの前) と ContainerRequest (リソース一致ステップの後) の 2 つの異なる拡張ポイントにインストールできるため、特別なケースになります。
ContainerRequestFilter インターフェイス リンクのコピーリンクがクリップボードにコピーされました!
javax.ws.rs.container.ContainerRequestFilter インターフェイスは以下のように定義されます。
ContainerRequestFilter インターフェイスを実装することで、サーバー側で以下のエクステンションポイントのいずれかにフィルターを作成できます。
-
PreMatchContainerRequest -
ContainerRequest
ContainerRequestContext インターフェイス リンクのコピーリンクがクリップボードにコピーされました!
ContainerRequestFilter の filter メソッドは、javax.ws.rs.container.ContainerRequestContext 型の引数を 1 つ受け取り、これは受信リクエストメッセージとその関連メタデータにアクセスするために使用できます。ContainerRequestContext インターフェイスは以下のように定義されます。
PreMatchContainerRequest フィルターの実装例 リンクのコピーリンクがクリップボードにコピーされました!
PreMatchContainerRequest エクステンションポイントのコンテナー要求フィルター (つまり、リソース一致の前にフィルターが実行される場合) を実装するには、ContainerRequestFilter インターフェイスを実装するクラスを定義し、クラスに @PreMatching アノテーションを付けます (PreMatchContainerRequest 拡張ポイントを選択するため)。
たとえば、以下のコードは、PreMatchContainerRequest エクステンションポイントにインストールされる単純なコンテナーリクエストフィルターの例を示しています。ここでは、優先度は 20 です。
ContainerRequest フィルターの実装例 リンクのコピーリンクがクリップボードにコピーされました!
ContainerRequest エクステンションポイント (つまり、リソース一致の 後 にフィルターが実行される場合) のコンテナー要求フィルターを実装するには、@PreMatching アノテーション なし で ContainerRequestFilter インターフェイスを実装するクラスを定義します。
たとえば、以下のコードは、ContainerRequest エクステンションポイントにインストールされる単純なコンテナーリクエストフィルターの例を示しています。ここで、優先度は 30 になります。
ResourceInfo の注入 リンクのコピーリンクがクリップボードにコピーされました!
ContainerRequest エクステンションポイント (つまりリソース一致発生 後) では、ResourceInfo クラスを注入することで、一致したリソースクラスとリソースメソッドにアクセスできます。たとえば、以下のコードは、ResourceInfo クラスを ContainerRequestFilter クラスのフィールドとしてインジェクトする方法を示しています。
呼び出しの中止 リンクのコピーリンクがクリップボードにコピーされました!
コンテナー要求フィルターに適した実装を作成して、サーバー側の呼び出しを中止できます。通常、認証機能や承認機能を実装する場合など、これはサーバー側でセキュリティー機能を実装するのに役立ちます。受信要求が認証に失敗した場合には、コンテナー要求フィルター内から呼び出しを中止できます。
たとえば、以下の事前照合機能は URI のクエリーパラメーターからユーザー名とパスワードを抽出し、認証メソッドを呼び出してユーザー名とパスワードの認証情報を確認します。認証に失敗すると、ContainerRequestContext オブジェクトで abortWith を呼び出すことで呼び出しが中断され、クライアントに返されるエラー応答を渡します。
サーバー要求フィルターのバインド リンクのコピーリンクがクリップボードにコピーされました!
サーバー要求フィルターを バインド する (Apache CXF ランタイムにインストールする) には、以下の手順を実行します。
以下のコードフラグメントで示されるように、
@Providerアノテーションをコンテナーリクエストフィルタークラスに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナーリクエストフィルター実装が Apache CXF ランタイムにロードされると、REST 実装はロードされたクラスを自動的にスキャンし、
@Providerアノテーション (スキャンフェーズ) の付いたクラスを検索します。XML で JAX-RS サーバーエンドポイントを定義する場合 (例: 「JAX-RS サーバーエンドポイントの設定」)、
jaxrs:providers要素のプロバイダーリストにサーバー要求フィルターを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記この手順は、Apache CXF の非標準要件です。厳密に言うと、JAX-RS 標準によれば、フィルターをバインドするために必要なのは
@Providerアノテーションのみです。しかし実際には、標準的なアプローチはやや柔軟性がなく、大規模なプロジェクトに多くのライブラリーが含まれている場合は、プロバイダーの衝突につながる可能性があります。