[Spring] Filter vs Interceptor


1.フィルタ
フィルターって何?
フィルタ(Filter)はJ 2 EE標準spec機能であり、Dispatcherサーブレットに要求を転送する前/後にurlモードに適合するすべての要求に対して追加操作を実行する機能を提供する.
データ収集ボードはスプリング先端に存在するフロントエンドコントローラであるため、フィルタはスプリング範囲外で処理される.
すなわち、Springコンテナではなく、TomcatなどのWebコンテナによって管理され(Spring Binとして登録)、Dispatcherサーブレットの前/後に処理される.これらの手順を図に示します.

[フィルタ(Filter)の方法]
フィルタを追加するにはjavaxを使用します.servletのFilterインタフェースを実装する必要があります.3つの方法があります.
public interface Filter { 

	public default void init(FilterConfig filterConfig) throws ServletException {} 
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; 
    
    public default void destroy() {} 
    
}
Initメソッド
Initメソッドは、フィルタオブジェクトを初期化し、サービスに追加する方法です.Webコンテナがinitメソッドを1回呼び出してフィルタオブジェクトを初期化する場合、以降のリクエストはdoFilterで処理されます.
doFilterメソッド
doFilterメソッドはurl-patternに適合するすべてのHTTP要求をDispatcherサーブレットに渡す前にWebコンテナによって実行されるメソッドである.doFilterのパラメータにはFilterChainがあり、FilterChainのdoFilterを介してリクエストを次のターゲットに転送します.chain.dofilter()の前後に必要な処理プロセスを加えて、私たちが望む処理を行うことができます.
破壊方法
destroyメソッドは、フィルタオブジェクトをサービスから削除して使用するリソースを返す方法です.これは、Webコンテナによって一度呼び出され、doFilterによって処理されなくなります.
2.インタフェース
[Interceptorとは?
インターフェース(Interceptor)はJ 2 EE標準スペックルフィルタ(Filter)とは異なり、Springが提供する技術であり、Dispatcherサーブレットがコントローラを呼び出す前と後に要求と応答を参照または加工する機能を提供する.すなわち,intercepterはWebコンテナで動作するフィルタとは異なりスプリングコンテキストで動作する.
Dispatcher Servicelet要求は、Handlerマッピングによって適切なコントローラを見つけると、実行チェーン(HandlerExecutionChain)に戻る.したがって、1つ以上のコントローラが登録されている場合、実行チェーンはこれらのコントローラによって順次実行され、コントローラがない場合は直接コントローラが実行されます.
コネクタはスプリングコンテナで動作するため、フィルタリング後、フロントエンドコントローラdispatcher slibleは要求を受信した後に動作します.このプロセスは図に示します.

[受信者(Interceptor)の方法]
Intercepter,orgを追加するために.springframework.web.servletのHandler Interceptorインタフェースを実装する必要があります.3つの方法があります.
public interface HandlerInterceptor { 

	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
    	return true; 
    } 
    
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } 
    
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } 
    
}
プリハンドメソッド
preHandleメソッドは、コントローラが呼び出される前に実行されます.したがって、コントローラの前に処理する必要がある前処理タスクまたは要求情報を加工または追加するために使用することができる.
preHandlerの3番目のパラメータhandlerパラメータは,@requestMappingメソッドを持つ情報を抽象化するHandlerマッピングによって見つけられたHandlerメソッドと呼ばれる新しいタイプのオブジェクトである.
さらに、preHandleの戻りタイプはbooleanであり、戻り値がtrueの場合は次のステップに進み、falseの場合は後続の操作(次のインタフェースまたはコントローラ)の実行を停止します.
PostHandleメソッド
postHandleメソッドはコントローラを呼び出した後に実行されます.このため、コントローラの後に続く処理を行うことができる.この方法は、コントローラが返すModelAndViewタイプの情報を提供するが、最近、Json形式でデータを提供するRestAPIベースのコントローラ(@RestController)が作成されたので、一般的ではない.
afterCompletionメソッド
afterCompletionメソッドは、すべてのタスクが完了した後に実行され、すべてのビューで最終結果を作成することを含む.処理要求を返すときに使用するリソースに適しています.
3.フィルターとインターフェースの違いと用途
[フィルタと受信機の違い]
フィルタとセパレータは、それぞれ管理するコンテナとリクエスト/レスポンスの操作性が異なり、用途も異なります.

上記の表の内容では、これらの内容の用途について詳しく説明します.
フィルタ(Filter)はスプリングシートに登録できないし、スペースを注入できないという人もいるが、これは誤った説明だ.これは非常に古い物語で、フィルタは現在スプリングシートとして登録することができ、他の場所に注入したり、他のスペースを注入したりすることができます.この問題については、次のリリースで詳しく説明します.
フィルタの用途と例
  • 一般的なセキュリティおよび認証/認証タスク
  • すべてのリクエストを記録またはレビュー
  • 画像/データ圧縮および文字列符号化
  • Springから切り離す機能が必要
  • フィルタは、スプリングに実質的に関係のないグローバルタスクを処理することができます.
    典型的な例は、セキュリティに関連する一般的な操作です.フィルタは前段でインターセプタより動作するため、グローバルなセキュリティチェック(XSS防御など)が必要であり、正しい要求でなければブロックすることができる.これにより、要求がスプリング容器に伝達されず、ブロックされるため、安定性をさらに向上させることができる.
    さらに、フィルタは、画像やデータの圧縮や文字列符号化などのWebアプリケーション全体の使用機能を実現するのに適している.FilterはInterceptorよりもはるかに強力な技術で、次のチェーンに渡されるサーブレットRequest/ServeretResponseオブジェクトを操作することができます.
    インタフェースの用途と例
  • 詳細なセキュリティおよび認証/認証汎用タスク
  • 記録または監査
  • API呼び出し
  • コントローラの加工情報(データ)
  • Intercepterでは、クライアントリクエストに関連するグローバルタスクを処理できます.
    代表的なのは、詳細なアプリケーションの認証または承認が必要な場合、クライアント要求に関連する操作です.たとえば、一部のグループのユーザーは、コントローラに切り替える前にチェックする必要がある機能を使用できない場合があります.そのため、intercepterで処理するのに適しています.
    また、intercepterは、フィルタとは異なり、HttpServeretRequestやHttpServeretResponseなどのオブジェクトを提供するため、オブジェクト自体を操作することはできません.逆に,オブジェクトの内部値は操作可能であるため,コントローラに伝達される情報を加工しやすい.例えば、JWTトークン情報は、コントローラにユーザ情報を提供するようにブロック化することができる.
    それ以外にも、様々な目的でAPI呼び出しの情報を記録する必要がある場合があります.この場合、HttpServeretRequestまたはHttpServeretResponseを提供するインタフェースは、クライアントのIPまたは要求情報を含む記録が容易である.
    代表的なのは、フィルタを認証や承認に使用するツールにSpringSecurityがあることです.SpringSecurityの特徴の1つは、フィルタに基づいて認証/認証処理を行うため、Spring MVCに依存しないことである.