web-dev-qa-db-ja.com

Spring MVCのインターセプターとフィルターの違い

FilterおよびInterceptorの目的について少し混乱しています。

ドキュメントから理解したように、Interceptorはリクエスト間で実行されます。一方、Filterは、ビューをレンダリングする前に、コントローラーが応答をレンダリングした後に実行されます。

では、InterceptorのpostHandle()とFilterのdoFilter()の違いはどこにありますか?

Spring MVC sheme どのユースケースを使用するのがベストプラクティスですか? FiltersとInterceptorsが機能するこの図では?

64
rpieniazek

HandlerIntercepterjavadoc から引用:

HandlerInterceptorは基本的にサーブレットFilterに似ていますが、後者とは対照的に、ハンドラー自体の実行を禁止するオプションを使用したカスタム前処理およびカスタム後処理を許可します。フィルタはより強力です。たとえば、チェーンで受け継がれる要求オブジェクトと応答オブジェクトを交換できます。フィルタは、アプリケーションコンテキストのHandlerInterceptorであるweb.xmlで設定されることに注意してください。

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

それが言われていると:

では、InterceptorのPostHandle()とFilterのdoFilter()の違いはどこにありますか?

postHandleは、ハンドラーメソッドの呼び出し後、ビューがレンダリングされる前に呼び出されます。したがって、ビューにさらにモデルオブジェクトを追加できますが、すでにコミットされているため、HttpServletResponsenot変更できます。 doFilterは、postHandleよりも多用途です。要求または応答を変更してチェーンに渡すか、要求処理をブロックすることもできます。

また、preHandleおよびpostHandleメソッドでは、リクエストを処理したHandlerMethodにアクセスできます。そのため、ハンドラー自体に基づいてプリポスト処理ロジックを追加できます。たとえば、いくつかの注釈があるハンドラーメソッドのロジックを追加できます。

どのユースケースを使用するのがベストプラクティスですか?

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

55
Ali Dehghani

HandlerInterceptorは、実際のターゲット「ハンドラー」にアクセスできるため、フィルターよりもきめ細かな制御を提供します。つまり、実行するアクションは、リクエストが実際に何をしているかによって異なります(一方、サーブレットフィルターは一般的に適用されます)すべてのリクエストに対して-各リクエストのパラメータのみを考慮することができます)。 handlerInterceptorには3つの異なるメソッドも用意されているため、ハンドラーを呼び出す前、ハンドラーが完了した後、ビューレンダリングの前(ビューレンダリングを完全にバイパスする場合もある)、またはビュー自体がレンダリングされた後に、動作を適用できます。また、ハンドラーのグループごとに異なるインターセプターを設定できます-インターセプターはhandlerMappingで構成され、複数のhandlerMappingsが存在する場合があります。

したがって、完全に一般的な何かを行う必要がある場合(たとえば、すべての要求をログに記録する)、フィルターで十分です-ただし、動作がターゲットハンドラーに依存する場合、または要求処理とビューレンダリングの間に何かを行う場合は、 HandlerInterceptorはその柔軟性を提供します。

リファレンス: http://static.springframework.org/sp...ng-interceptor

3
Satyam

Filter:-名前が示すように、フィルターは、各着信HTTP要求および各HTTP応答に対してサーブレットコンテナーによって実行されるJavaクラスです。この方法により、JSPページ、サーブレット、または単純な静的ページなどのリソースに到達する前に、HTTP着信要求を管理できます。同様に、リソースの実行後にHTTPアウトバウンドレスポンスを管理することもできます。

Interceptor:-Spring InterceptorはServlet Filtersに似ていますが、Spring Contextで動作するため、HTTPリクエストとレスポンスを管理するのに非常に強力ですが、すべてのSpringコンテキストにアクセスできるため、より洗練された動作を実装できます。

3
Manas