ホームページ  >  記事  >  Java  >  Spring インターセプターの実装原理を調べる

Spring インターセプターの実装原理を調べる

王林
王林オリジナル
2024-01-11 15:18:23656ブラウズ

Spring インターセプターの実装原理を調べる

Spring インターセプターの実装メカニズムを明らかにする

はじめに

Web アプリケーションを開発するとき、リクエストがコントローラーに到達する前または後に待機する必要があることがよくあります。何かをしてください。たとえば、ユーザーの認証、ログの記録、例外の処理などです。 Spring フレームワークは、これらの操作を実装するためのインターセプター (インターセプター) を提供しており、インターセプターはリクエストと応答を前処理および後処理できます。

この記事では、Spring インターセプターの実装メカニズムについて詳しく説明します。インターセプターとは何か、どのように機能するかを理解し、具体的なコード例を通じてカスタム インターセプターを実装する方法を示します。

インターセプターの概念

インターセプターは、リクエストの前処理および後処理に使用される Spring フレームワークのメカニズムです。これはサーブレットのフィルターに似ていますが、フィルターとは異なり、インターセプターはメソッド レベルに基づいています。指定されたコントローラーのメソッドをインターセプトし、メソッドの実行前後にカスタム ロジックを実行できます。インターセプターは、ビジネス ロジックとは関係のない一般的な処理を実装し、コードの再利用性と保守性を向上させるのに役立ちます。

インターセプターの仕組み

インターセプターは、AOP (アスペクト指向プログラミング) を通じて実装されます。 Spring インターセプターは、preHandle、postHandle、afterCompletion の 3 つのメソッドを定義する HandlerInterceptor インターフェイスに基づいています。具体的なワークフローは次のとおりです。

  1. クライアントが DispatcherServlet にリクエストを送信すると、DispatcherServlet はリクエストされた URL に基づいて対応する HandlerMapping を検索し、対応する HandlerExecutionChain を取得します。
  2. HandlerExecutionChain には、一連の HandlerInterceptor が含まれています。
  3. DispatcherServlet は、各インターセプターの preHandle メソッドを順番に呼び出し、メソッドの戻り値をチェックします。

    • true が返された場合、リクエストは処理を続行し、次のインターセプターの preHandle メソッドに入ります。
    • false が返された場合、リクエストはここで中断され、クライアントに返されます。
  4. すべてのインターセプタ preHandle メソッドが true を返すと、DispatcherServlet は HandlerExecutionChain の Handler オブジェクトの handleRequest メソッドを呼び出します。
  5. HandlerExecutionChain の Handler オブジェクトはビジネス ロジックを実行し、ModelAndView を返します。
  6. DispatcherServlet は、各インターセプターの postHandle メソッドを順番に呼び出し、ModelAndView を渡します。
  7. インターセプターの postHandle メソッドは、ModelAndView を変更および拡張できます。
  8. DispatcherServlet は、ビューの解析とレンダリングのために ModelAndView を ViewResolver に渡します。
  9. ビューがレンダリングされると、DispatcherServlet は各インターセプターの afterCompletion メソッドを順番に呼び出して、一部のリソースをさらにクリーンアップします。

カスタム インターセプターの実装

以下では、特定の例を使用してカスタム インターセプターを実装する方法を示します。

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //  在方法执行之前进行逻辑处理
        System.out.println("拦截器preHandle方法执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在方法执行之后进行逻辑处理
        System.out.println("拦截器postHandle方法执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在视图渲染完成后进行逻辑处理
        System.out.println("拦截器afterCompletion方法执行");
    }
}

上記のコードでは、HandlerInterceptor インターフェイスを実装し、その 3 つのメソッドを書き直しました。 preHandle メソッドでは前処理を実行でき、postHandle メソッドでは ModelAndView を変更および拡張でき、afterCompletion メソッドではリソースのクリーンアップ操作を実行できます。

次に、カスタム インターセプターを Spring コンテナーに構成する必要があります。これは、XML 構成または注釈を通じて実現できます。

XML 設定方法

Spring 設定ファイルに次の設定を追加します。

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/login" />
        <bean class="com.example.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

上記の設定では、<interceptor></interceptor> タグを使用してインターセプターを定義し、<mapping></mapping> タグを通じてインターセプトする URL パスを指定します。 <exclude-mapping></exclude-mapping> タグを使用して、インターセプトする必要のない一部の URL パスを除外します。

アノテーションを使用したインターセプターの構成

@Component アノテーションをインターセプター クラスに追加し、@Order アノテーションを使用して実行順序を指定しますインターセプターの。

@Component
@Order(1)
public class MyInterceptor implements HandlerInterceptor {
    // 省略代码
}

Spring の構成クラスに次の構成を追加します:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }
}

上記の構成では、WebMvcConfigurer インターフェイスを実装し、レジストリ内の addInterceptors メソッドを書き換えることによって、インターセプターをインターセプターに追加します。

結論

この記事を通じて、Spring インターセプターの概念と動作原理を理解し、特定のコード例を通じてカスタム インターセプターを実装する方法を示しました。インターセプターは Spring フレームワークの非常に重要な機能であり、一般的な処理ロジックを実装し、コードの再利用性と保守性を向上させるのに役立ちます。この記事が Spring インターセプターの理解に役立つことを願っています。

以上がSpring インターセプターの実装原理を調べるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。