InterceptorとFilter


フィルター、遮断器が必要な理由


Springコードを実装するには,共通の処理が必要な作業が多い.すべてのページに共通の作業に関連するコードを記述する必要がある場合、重複するコードが多くなると、ソースコードの管理が難しくなります.
スプリングに汎用的な処理を行うには、以下の方法を用いることができる.
  • Filter
  • Interceptor
  • AOP
  • filter


    サーバの実行前と実行後の操作に使用します.これにより、DispatcherServiceletの先端、すなわちスプリングコンテナの外で動作します.クライアントとリソースの間には、1つのチェーンからなる複数のフィルタが集まっています.代表的には、符号化変換処理、XSS防御、LOG、セキュリティ、画像変換、データ圧縮、キャッシュ等を実現するために用いられる.
  • スプリングコンテナの空白は使用できないため、ビジネスロジックに関連する操作は実行できません.
  • 優先パラメータの設定は、主にTomcatを使用する場合のwebです.xmlまたはJava構成を使用して実装できます.
  • インプリメンテーション


    フィルタを追加するにはjavaxを使用します.servletを実現するFilterインタフェースが必要で,3つの方法がある.
  • initメソッドは、フィルタオブジェクトを初期化し、サービスに追加する方法である.Webコンテナがinitメソッドを1回呼び出してフィルタオブジェクトを初期化する場合、以降のリクエストはdoFilterで処理されます.
  • public default void init(FilterConfig filterConfig) throws ServletException {}
  • doFilterメソッドはurl-patternに適合するすべてのHTTP要求がDispatcherサーブレットに送信される前にWebコンテナによって実行される方法である.doFilterのパラメータにはFilterChainがあり、FilterChainは次のフィルタ、FilterChainを指します.doFilter()は、次のフィルタを呼び出します.次のフィルタがない場合は、サーブレットのサービス()が内部から呼び出されます.chain.dofilter()の前後に必要な処理プロセスを加えて、私たちが望む処理を行うことができます.
  • public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain) throws IOException, ServletException;
  • destroyメソッドは、フィルタされたオブジェクトをWebコンテナから削除して使用したリソースに戻す方法である.これは、Webコンテナによって一度呼び出され、doFilterによって処理されなくなります.
  • さぎょうモード


    ①サーブレットコンテナWebアプリケーションを起動すると、DDファイル(web.xml)に登録されているフィルタインスタンスが作成され、init()が呼び出されます.
    ②お客様が要求した場合は、該当するフィルタのdoFilter()を呼び出します.
    ③doFilter()で操作を行い、次のフィルタのdoFilter()を呼び出します.
    ④最後のフィルターまで③を繰り返す.
    ⑤最後のフィルタがサーブレットのサービス()を呼び出す.
    ⑥サーブレットのサービス()が終了すると、コールサービス()の前のフィルタに戻ります.
    ㅇ最初の呼び出しのフィルタに戻ることを繰り返す.
    ◇最後に応答結果をクライアントに送信します.

    Interceptor


    インタフェースはSpringが提供する技術で、サーバ呼び出しコントローラ(Handler)を派遣する前に、その後に特定の要求と応答を処理することができます.
  • DispatcherサーブレットはHandlerマッピングでコントローラを探し、1つ以上のintercepterが登録されている場合はintercepterでコントローラを順次実行し、intercepterがない場合は直ちにコントローラを実行する.
  • の優先パラメータは、主にサーブレットContextです.xmlまたはJava構成による
  • の実装
    最も代表的なのは、認証/承認などの共通のタスク、コントローラに伝達される情報を処理する加工、登録処理によく用いられることである.

    インプリメンテーション


    Intercepter,orgを追加するために.springframework.web.servletを実装しなければならないHandler Interceptorインタフェースには、次の3つの方法があります.
  • プリHandle方法は、コントローラ呼び出しの前に処理しなければならないプリプロセッシングタスクまたは要求情報を加工または追加するために使用することができる.
  •  default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 
     { return true; }

  • postHandleメソッドは、コントローラを呼び出した後に処理する必要がある後処理タスクに使用できます.この方法は、コントローラが返すModelAndViewタイプのパラメータを提供しますが、最近作成されたRestAPIベースのコントローラ(@RestController)はあまり一般的ではなく、Json形式でデータを提供します.

  • afterCompletionメソッドは、すべてのタスクが完了した後に実行され、すべてのビューで最終結果を作成することを含む.処理要求を返すときに使用するリソースに適しています.
  • さぎょうモード


  • DispatcherServiceletはクライアント要求を受信します.

  • Handlerオブジェクトを取得して、HandleMappingからの所定の要求を処理します.

  • インポートしたHandlerを呼び出すためにHandler Adapterオブジェクトを指定します.

  • コントローラを処理するHandlerオブジェクトにブロッカーを適用する場合は、precandleメソッドを呼び出します.

  • コントローラメソッドを実行した後、ModelAndViewを取得します.

  • postHandle

  • ModelAndViewでビュー名をViewResolverに渡し、応答に必要なビューオブジェクトを取得します.

  • モデルをViewオブジェクトに渡してレンダリング方法を呼び出す

  • afterCompletion
  • いじょうりゅう


    preHandleに異常が発生した場合、後のpostHandleは呼び出されません.ただし、afterCompletionは常に呼び出されます.

    Filter VS Interceptor VS AOP


    フィルタとインタフェース


  • じっこうじかん
  • フィルタはWebコンテナにあり、受信機はSpringコンテナにあります.
  • FilterはDispatcher servletのフロントエンドで情報を処理し、
  • .
  • Dispatcher servletはコントローラ間で情報を処理する.

  • さぎょうはんい
  • フィルタは、スプリングに関係のないグローバルタスクを基本的に処理することができる.(ServeretRequest/ServeretResponseオブジェクトを操作可能)
  • 受信機は、ばね容器内のすべてのオブジェクトにアクセスすることができる.
  • 受信者は、HttpServeretRequestまたはHttpServeretResponseなどのオブジェクトを提供するので、オブジェクト自体を操作することはできない.逆に,オブジェクトの内部値は操作可能であるため,コントローラに伝達される情報を加工しやすい.

  • 使用領域:主に符号化やセキュリティ関連処理などのweb appのグローバル処理が必要な論理をフィルタで実現し,クライアント要求に関わるグローバル処理が必要なタスクについては主にインタフェースで処理する.
  • 代表的なのは、フィルタを認証や承認に使用するツールにSpringSecurityがあることです.SpringSecurityの特徴の1つは、フィルタに基づいて認証/認証処理を行うため、Spring MVCに依存しないことである.

    IntercepterとAOPの違い


    コントローラアプリケーションの追加機能は、AOPを適用するためにadviceに設定することができる.
    でも、
  • Springのコントローラのタイプや実行方法は様々なので、ポイントカットを書くのは難しいです(適切な方法を選択).
  • Springのコントローラのパラメータまたは戻りタイプは固定されていません.
  • したがって、AOPをコントローラに適用する場合は複雑になる可能性があり、追加機能はインタフェースを使用することが望ましい.