Handler Interceptorとは?



この文章の目的は?


Handler Interceptorについて

HandlerInterceptor


Handlerの実行前と実行後に、完了時に他の操作を実行する場合は、それを使用します.複数のプロセッサで繰り返し使用されるコードを減らす場合に使用できます.(ログ記録、検証チェック、Localeの変更など)
複数のHandler Interceptorを使用する場合は、次の順序で適用されます.(PreHandleを除き、残りのPostHandleとAfterCompletionは逆順で行います)
  • PreHandle 1
  • PreHandle 2
  • 要求処理
  • PostHandle 2
  • PostHandle 1
  • レンダー
  • ビュー(REST APIでは省略)
  • AfterCompletion 2
  • AfterCompletion 1
  • PreHandle

    boolean preHandle(request, response, handler)
    Handlerが実行される前に呼び出されます.Handlerに関する情報を使用することができるので、論理はシーケンスボードフィルタよりも詳細に実現できる.戻り値として、要求、応答を次のインタフェースまたはHandler(false)に転送します.

    PostHandle

    void postHandle(request, response, modelAndView)
    Handlerの実行が完了し、ビューがレンダリングされる前に呼び出されます.非同期リクエストは呼び出されません.

    AfterCompletion

    void afterCompletion(request, response, handler, ex)
    リクエスト処理とビューレンダリングが完了したら呼び出されます.PreHandlerがtrueを返す場合にのみ、PostHandleと同じ非同期要求は呼び出されません.

    使用方法


    使い方が簡単です.HandleInteptorインタフェースを実装し、WebConfiguratorインタフェースを使用して実装されたクラスを登録します.
    public class GreetingInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("Greeting PreHandle");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("Greeting PostHandle");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("Greeting AfterCompletion");
        }
    }
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // Order 옵션을 주지 않으면 Add한 순서대로 적용
            registry.addInterceptor(new GreetingInterceptor()).order(0);
            registry.addInterceptor(new AnotherInterceptor())
                    .addPathPatterns("/hi/")
                    .order(-1);
        }
    }

    タブレットフィルターとの違いは?


    Handler Interceptorの違いは、Sublitフィルタよりも具体的な処理が可能であることである.平板フィルターは、主に一般的な用途を実現する機能に使われているそうです.例えば,XSSのような攻撃はLucy−xssのようなオープンソースWebをもたらす.xmlに登録し、スライスフィルタで実現すべきだそうです.

    本文の参考

  • 白奇仙のSpringWeb MVC