回答:
HandlerIntercepter
のjavadocから:
HandlerInterceptor
は基本的にServletに似てFilter
いますが、後者とは対照的に、ハンドラー自体の実行を禁止するオプション付きのカスタム前処理とカスタム後処理のみを許可します。フィルターはより強力です。たとえば、チェーンで受け渡される要求オブジェクトと応答オブジェクトを交換できます。フィルタで構成されることを注意してweb.xml
、HandlerInterceptor
アプリケーション・コンテキストに。基本的なガイドラインとして、きめの細かいハンドラー関連の前処理タスクは、
HandlerInterceptor
実装の候補です。特に、除外された共通ハンドラーコードと承認チェックです。一方、Filter
マルチパートフォームやGZIP圧縮など、リクエストコンテンツやビューコンテンツの処理にはが適しています。これは通常、フィルターを特定のコンテンツタイプ(画像など)またはすべてのリクエストにマップする必要がある場合を示します。
それが言われていると:
だからここでの違いである
Interceptor#postHandle()
とはFilter#doFilter()
?
postHandle
ハンドラーメソッドの呼び出しの後、ビューがレンダリングされる前に呼び出されます。したがって、ビューにさらにモデルオブジェクトを追加できますが、すでにコミットされているので変更できませんHttpServletResponse
。
doFilter
はpostHandle
。よりはるかに用途が広いです。要求または応答を変更してチェーンに渡すか、要求処理をブロックすることもできます。
また、preHandle
およびpostHandle
メソッドではHandlerMethod
、リクエストを処理したにアクセスできます。したがって、ハンドラー自体に基づいて前処理/後処理ロジックを追加できます。たとえば、いくつかの注釈を持つハンドラーメソッドのロジックを追加できます。
どのユースケースで使用するのがベストプラクティスですか?
ドキュメントが言ったように、きめの細かいハンドラー関連の前処理タスクは、HandlerInterceptor
実装の候補です。特に、除外された共通ハンドラーコードと承認チェックです。一方、Filter
マルチパートフォームやGZIP圧縮など、リクエストコンテンツやビューコンテンツの処理にはが適しています。これは通常、フィルターを特定のコンテンツタイプ(画像など)またはすべてのリクエストにマップする必要がある場合を示します。
HandlerIntercepter
Spring固有の概念です。サーブレットフィルターを登録するには、古いweb.xml
(サーブレット2.5および古いバージョン)または新しいプログラムによるアプローチ(サーブレット3+)を使用して登録できます。これHandlerIntercepter
は単なるSpringの抽象概念なので、Springのコンテキストで登録する必要があります
フィルター:-名前が示すように、フィルターは、各着信HTTP要求および各http応答に対してサーブレットコンテナーによって実行されるJavaクラスです。これにより、JSPページ、サーブレット、単純な静的ページなどのリソースに到達する前に、HTTP着信要求を管理できます。同じ方法で、リソース実行後のHTTPアウトバウンド応答を管理できます。
インターセプター:-スプリングインターセプターはサーブレットフィルターに似ていますが、Springコンテキストで機能するため、HTTP要求と応答を管理するのに強力ですが、すべてのSpringコンテキストにアクセスできるため、より高度な動作を実装できます。
HandlerInterceptorを使用すると、実際のターゲット「ハンドラ」にアクセスできるため、フィルタよりもきめ細かい制御が可能になります。つまり、実行するアクションは、要求が実際に行っていることに応じて変化する可能性があります(サーブレットフィルタは一般的に適用されます)すべてのリクエストに-各リクエストのパラメータのみを考慮することができます)。また、handlerInterceptorには3つの異なるメソッドが用意されているため、ハンドラーを呼び出す前、ハンドラーが完了した後、ビューのレンダリング前に(ビューのレンダリングを完全にバイパスすることもできる)、またはビュー自体がレンダリングされた後に、動作を適用できます。また、ハンドラーのグループごとに異なるインターセプターを設定できます。インターセプターは、handlerMappingで構成され、複数のhandlerMappingsが存在する場合があります。
したがって、完全に一般的な何かを行う必要がある場合(すべての要求をログに記録するなど)、フィルターで十分です。ただし、動作がターゲットハンドラーに依存する場合、または要求の処理とビューのレンダリングの間に何かを実行する場合は、 HandlerInterceptorはその柔軟性を提供します。
リファレンス:http : //static.springframework.org/sp...ng-interceptor