1. ホーム
  2. java

[解決済み] Spring MVCにおけるInterceptorとFilterの相違点

2022-05-09 10:53:05

質問

について少し混乱しています。 FilterInterceptor の目的で使用されます。

ドキュメントから理解したところでは Interceptor はリクエストの間に実行されます。一方 Filter はビューをレンダリングする前に実行されますが、Controller がレスポンスをレンダリングした後に実行されます。

とはどこが違うのでしょうか? postHandle() をインターセプターで使用するのと doFilter() は、Filterの中にあるのですか?

どのようなケースで使うのがベストプラクティスなのでしょうか? この画像では FilterInterceptor s?

どのように解決するのですか?

から HandlerIntercepter 's ジャバドック :

HandlerInterceptor は基本的にサーブレットに似ています Filter しかし 後者とは対照的に、これはカスタムの前処理を可能にするだけで、その前処理は ハンドラ自体の実行を禁止するオプションと、ハンドラの実行を禁止するオプションがあります。 後処理を行います。フィルタはより強力で、例えば次のようなことが可能です。 リクエスト・オブジェクトとレスポンス・オブジェクトを交換する。 チェーンになります。フィルタの設定は web.xml , a HandlerInterceptor をアプリケーションコンテキストに追加します。

基本的なガイドラインとして、細かいハンドラ関連の前処理タスクは の候補になります。 HandlerInterceptor の実装、特に ファクトアウトされた共通ハンドラコードと認可チェック。一方 一方 Filter は、リクエストの内容やビューに適しています。 マルチパートフォームやGZIP圧縮のようなコンテンツ処理。これは 一般的には、特定のコンテンツにフィルタを適用する必要がある場合です。 のタイプ (例: 画像)、またはすべてのリクエストに対応します。

そう言われると

では、その違いはどこにあるのでしょうか。 Interceptor#postHandle()Filter#doFilter() ?

postHandle はハンドラメソッド呼び出しの後、ビューがレンダリングされる前に呼び出されます。そのため、ビューにさらにモデルオブジェクトを追加することができますが、その際 ではない を変更します。 HttpServletResponse はすでにコミットされているからです。

doFilter よりもはるかに汎用的です。 postHandle . リクエストやレスポンスを変更してチェーンに渡したり、リクエストの処理をブロックしたりすることもできます。

また preHandlepostHandle メソッドにアクセスできるようになります。 HandlerMethod は、リクエストを処理した そのため、ハンドラ自身をベースにした前処理・後処理のロジックを追加することができます。例えば、何らかのアノテーションを持つハンドラメソッドに対して、ロジックを追加することができます。

<ブロッククオート

どのようなユースケースで使用するのがベストプラクティスでしょうか?

ドキュメントにあるように、細かいハンドラ関連の前処理タスクは、以下のような候補になります。 HandlerInterceptor 特に、ファクタアウトされた共通ハンドラコードと認可チェックがそうです。一方 Filter は、マルチパートフォームやGZIP圧縮のような、リクエストコンテンツやビューコンテンツの処理によく適しています。これは通常、フィルタを特定のコンテンツタイプ (例えば画像) やすべてのリクエストに対応させる必要があるときに現れます。