web-dev-qa-db-ja.com

Spring HandlerInterceptor vs Servlet Filters

HandlerInterceptor s Springでは、<mvc:interceptors>を使用して特定のURLでのみ呼び出されるように設定できるようになりました。

サーブレットフィルタは同じ機能(ロギング、セキュリティなど)を実現できます。それで、どれを使うべきですか?

インターセプターでは、ModelAndViewオブジェクトを使用してモデルを操作できるため、より多くの利点があります。フィルターやインターセプターが他のものよりも有利なシナリオを描くことはできますか?

63
aces.

org.springframework.web.servlet.HanderInterceptorインターフェイス JavaDoc 自体には、この質問について説明する2つの段落があります。

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

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

58
Ralph

Spring Handlerインターセプターを使用すると、リクエストのライフサイクルのより多くの部分にフックし、プロセス内のより多くの情報にアクセスできます。多くの場合、フィルタよりもリクエスト/レスポンスサイクルと密接に結びついています。

フィルターは、要求/応答をブラックボックスシステムとして扱う場合に適しています。サーブレットの実装方法に関係なく機能します。

Spring MVCを使用している場合、サーブレットフィルターとして新しいロジックを記述する理由はほとんどありません。フィルターができることはすべて、インターセプターはより簡単かつエレガントにできます。

また、サーブレットフィルターはインターセプターよりもずっと長い間使用されてきました。

25
skaffman

Springインターセプターを使用すると、便利なハンドラーにアクセスできます。また、Springインターセプターを使用すると、ビューがレンダリングされる前とレンダリングされた後にロジックを実行するためのアクセス権があります。

4
smp7d