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


108

FilterInterceptor目的について少し混乱しています。

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

ではpostHandle()、インターセプターとdoFilter()フィルターの違いはどこですか?

Spring MVCスキーマ どのユースケースで使用するのがベストプラクティスですか?この写真FilterのsとInterceptorsはどこで機能しますか?

回答:


87

HandlerIntercepterjavadocから:

HandlerInterceptorは基本的にServletに似てFilterいますが、後者とは対照的に、ハンドラー自体の実行を禁止するオプション付きのカスタム前処理とカスタム後処理のみを許可します。フィルターはより強力です。たとえば、チェーンで受け渡される要求オブジェクトと応答オブジェクトを交換できます。フィルタで構成されることを注意してweb.xmlHandlerInterceptorアプリケーション・コンテキストに。

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

それが言われていると:

だからここでの違いであるInterceptor#postHandle()とは Filter#doFilter()

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

doFilterpostHandle。よりはるかに用途が広いです。要求または応答を変更してチェーンに渡すか、要求処理をブロックすることもできます。

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

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

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


フィルターは、アプリケーションコンテキストのHandlerInterceptorであるweb.xmlで構成されます。説明できますか?

4
フィルターはサーブレットAPIに関連し、HandlerIntercepterSpring固有の概念です。サーブレットフィルターを登録するには、古いweb.xml(サーブレット2.5および古いバージョン)または新しいプログラムによるアプローチ(サーブレット3+)を使用して登録できます。これHandlerIntercepterは単なるSpringの抽象概念なので、Springのコンテキストで登録する必要があります
Ali Dehghani

FilterはサーブレットAPIに関連し、HandlerIntercepterはSpring固有の概念です。正しい!しかし、web.xmlによる登録の一部はWebApplication、ディスパッチャごとに1つであるため、サーブレットとフィルタの両方がコンテキストに関連付けられており、インターセプタとフィルタを関連付けるrootContextことをお勧めします。

9

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

インターセプター:-スプリングインターセプターはサーブレットフィルターに似ていますが、Springコンテキストで機能するため、HTTP要求と応答を管理するのに強力ですが、すべてのSpringコンテキストにアクセスできるため、より高度な動作を実装できます。


2
ソース:mkjava.com/tutorial/filter-vs-interceptorはソースに言及する必要がある
Premraj

Springセキュリティフィルターについてはどうですか?それはあなたに春のコンテキストも与えます
Lovin

6

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

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

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


2
リンクが壊れています。
Jason Law
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.