FilterとInterceptor


💡 Spring Frameworkの内部動作を学習する場合、FilterとInterceptorは無視できない要素です.なぜ内部ロジックにFilterとInterceptorが置かれているのですか?より高いレベルのプロジェクトを開発するには、それを理解し、十分に活用する必要があります.単純に「あり」フィルタと「Interceptor」と言えば、フィルタと「Interceptor」の存在の利点を逃して開発されます.では、なぜFilterとInterceptorを設定し、どのような役割を果たし、どのような違いがあるのかを理解してみましょう.✌️

なぜ必要なのか。


Java Webアプリケーションを開発するには、要求に合ったAPIを開発するだけでなく、必要な要素を開発する必要があります.
  • ユーザ認証
  • 権限検査(承認)
  • セキュリティ
  • XSS, CORS
  • 記録
  • 画像圧縮とデータフォーマット変換
  • APIのURLによっては、異なるアクションが必要になる場合がありますが、同じアクションでも異なるアクションでも、すべてのAPIに共通して適用する必要があります.
    以上の理由は、ご覧のように、フィルタと受信者がこれらの要素を担当し、実施しているからです.なぜそれらの役を演じるために誕生し、その2つの概念を創造したのだろうか.
    ないことを考えると簡単だと思います.この2つのレイヤがない場合は、ControllerとService Layerでクライアントのリクエストを処理するしかありません.これらの要因はすべてのAPIの共通点ですが、アプリケーションの増加に伴い、コード量が大きくなり、重複性が大きくなり、アプリケーションも重くなります.
    したがって,異なる時点から注目点の分離が必要である.注目点を分けると、次のようなメリットが得られます.
  • メンテナンスが容易です.
  • の開発では、注目点に集中できます.
  • コード再利用(重複除外)
  • では、興味点は何時に分かれましたか?

    Spring MVC内部動作

  • クライアントがサーブレットコンテナへのアクセスを要求する前に(1)

  • DispatcherServiceletからコントローラへのアクセスを要求する前(2)

  • ControllerからService Repository~(3)

  • +DispatcherServiceletとは?
    DispatcherServiceletは、クライアントに送信されたHTTPリクエストをコントローラに転送する役割を果たします.フロントエンドコントローラは、コントローラに比べてリクエストを受信するため、フロントエンドコントローラとも呼ばれます.こいつもFilterやInterceptorの誕生背景に似た場所があり、DispatcherServeretが現れる前にHTTPリクエストを発行するAPIにサーバを逐一実装し、各サーバのコントローラにマッピングしなければならない.
    この問題を解決するためにDispatcherServiceletが発生した.
    DispatcherServiceletの役割は、すべてのHTTP要求を受信し、要求に対して汎用的な操作(例えば、ハングル/英語符号化)を実行し、コントローラに送信することです.
    DispatcherServiceletはまた、要求をアプリケーション要求からリソースフォルダ内の静的リソース(画像、ファイル、html)に分離処理する機能を提供し、要求が入力されると、コントローラ(アプリケーション)はその要求のマッピングにナビゲートし、そうでない場合は論理的にリソースにアクセスする.
  • どんな役を演じますか。



    上図により,この3つの分離点をよく理解できた.
    (1)クライアントがスプリングコンテナへのアクセスを要求する前:Filterの役割
    要求に到達する前に、Filterは、サーブレットContainerのDispatcherServiceletを使用して、DispatcherServiceletからの応答データを受信し、クライアントに戻る前にデータを操作します.通常、Webアプリケーションはグローバルアクション(ex)セキュリティ処理を実行します.
  • CORS
  • XSS
  • 認証
  • セキュリティに関連する操作に加えて、次の操作を実行できます.
  • 文字列符号化
  • 画像およびデータ圧縮
  • (2)DispatcherServiceletからコントローラへのアクセスを要求する前:Interceptorの役割
  • dispatcherServlet → Controller
  • Controller → dispatcherServlet
  • 上記の2つのプロセスでは、Interceptorが操作を実行します.通常、アクセス権チェック(承認)、ビューレンダリング前のその他の操作を実行します.
    (3)コントローラ上のサービス-レポート~
    上記のFilterロールとInterceptorロールのため、制御プログラム-サービス-レポート層は、アプリケーションではなく、それぞれのロールとロールに重点を置くことができます.
    何が良くなったの?🗯️
  • 各階層の凝集力が向上しました!
  • 各階層の結合度が下がった!
  • は効率的にコードを書くことができ、メンテナンスが容易です.
  • どんな違いがありますか。


    A. Filter

    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() {}
    
    }

    B. Interceptor

    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 {
    	}
    
    }
    上記では、異なる実行時間と異なる役割について議論したので、2つの主な違いについて議論したいと思います.
  • Exception Handling
  • スプリングには、特定の値に応じて2つの異常処理がある可能性があります.
  • Dispatcherサーブレット異常(ルートSpring Containerを含む)
  • の場合、HandlerExceptionResolverで例外処理を実行できます.上記の場合、HandlerExceptionResolverを使用すると簡単に異常処理が行えます.
  • Dispatcherサーブレット以外の 「テンプレート」(Filter)で例外が発生しました(Webアプリケーションレベルの例外)
  • フィルタに異常処理用のフィルタを配置し、try-catchを使用して異常処理を実行する
  • セキュリティ認証処理の場合は、例外を「Exception TranslationFilter」から除外して例外処理を実行します.
  • Handler Exception Resolverをbeanとして登録し、Global Exception Handlerで例外処理
  • を実行する.
  • 要求/応答操作性
  • Filterは、要求/応答データをサーブレットRequestおよびサーブレットResponseオブジェクトとして提供するため、操作を行うことができる.一方、受信者は、要求/応答データをHttpServeretRequestおよびHttpServeretResponseオブジェクトとして提供するため、操作できない.
    そのため、フィルタは通常画像とデータ圧縮を実行し、Interceptorはオブジェクト内部値によってコントローラに必要なフォーマットのデータ加工を実行する.

    振り返る


    実際、私たちが発表することにしたのは、Spring Securityを通じて複数のFilterを学び、FilterとInterceptorがSpringで重要な役割を果たしていることを発見したからです.
    このプレゼンテーションを作成すると、Spring Securityが常に複数のフィルタを使用してセキュリティタスクを実行している理由がわかります.これにより、Spring Securityの適用と学習が容易になります.
    次にSpring SecurityにおけるFilterとプロジェクトにおけるCorsFilter応用,および上述した2つの概念に類似したAOPについて議論する.🤭

    コメントドキュメント


    SpringフィルタとInterceptorの違いと用途
    (Spring)FilterとInterceptorの違い
    Spring Filter、Interceptor、AOP
    Spring]Filter、Interceptor、AOP差異とクリア
    [ココ面接]Spring Filter、Interceptor、AOP
    FilterとInterceptorの違いは何ですか?
    Java「Spring」FilterとInterceptor
    Spring Interceptorとは何ですか。フィルターとアイソレータの違い
    Filter VS Interceptor
    Dispatcher-Servlet(Dispatcherサーブレット)とは?
    プレート容器とスプリング容器
    [スプリング]スプリングでの異常処理