ホームページ > Java > &#&チュートリアル > SpringBootインターセプタの使い方

SpringBootインターセプタの使い方

王林
リリース: 2023-05-16 13:01:06
転載
1744 人が閲覧しました

HandlerInterceptor 詳細な説明

HandlerInterceptor プロセッサ実行チェーンの handler ワークフロー インターフェイスのカスタマイズを可能にします。インターセプターをカスタマイズして、ハンドラー プロセッサーをインターセプトすることができます (コントローラー層のインターフェースとして理解できます)。これにより、いくつかの一般的な反復処理動作 (インターフェース認証、インターフェース ロギング、パフォーマンス監視など) を追加することなく追加できます。各ハンドラーの実装を変更します。

注、この説明は SpringBoot 2.3.12.RELEASE バージョンに基づいています。

HandlerInterceptor インターフェイスには、デフォルトの空の実装メソッドが 3 つしかありません。下位バージョンでは、これら 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 {
	}
}
ログイン後にコピー

これら 3 つのメソッドの実行シーケンス図は次のとおりです。

SpringBootインターセプタの使い方

preHandle

preHandle Pre-ハンドラーの実行をインターセプトするために、HandlerMapping が適切なハンドラー オブジェクトを決定した後、HandlerAdapter がプロセッサを呼び出す前に、preHandle メソッドが呼び出されます。コントローラー インターフェイスは呼び出される前に実行されることが簡単に理解できます。

Intercepter はチェーンされています。つまり、次々に実行されます。このメソッドが true を返した場合、次のインターセプターまたはハンドラーが直接実行されます。このメソッドが false を返すか例外をスローした場合、実行チェーンは終了し、ハンドラーは呼び出されなくなります。

このメソッドが true を返さない場合、postHandle および afterCompletion は実行されないことに注意してください。

それでは、この方法は何に役立つのでしょうか?実際、インターフェイスが呼び出される前に、ユーザー権限の検証などの前処理を行うことができます。

package com.chenpi;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * @Description 用户权限验证拦截
 * @Author 陈皮
 * @Date 2021/6/27
 * @Version 1.0
 */
@Component
public class UserPermissionInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) {

        if (handler instanceof HandlerMethod) {

            HandlerMethod handlerMethod = (HandlerMethod) handler;

            // 获取用户权限校验注解
            UserAuthenticate userAuthenticate =
                    handlerMethod.getMethod().getAnnotation(UserAuthenticate.class);
            if (null == userAuthenticate) {
                userAuthenticate = handlerMethod.getMethod().getDeclaringClass()
                        .getAnnotation(UserAuthenticate.class);
            }
            if (userAuthenticate != null && userAuthenticate.permission()) {
                // 验证用户信息
                UserContext userContext = userContextManager.getUserContext(request);
                if (null == userContext) {
                    return false;
                }
            }
        }
        return true;
    }
}
ログイン後にコピー

postHandle

postHandle 後処理は、HandlerAdapter がプロセッサを呼び出した後、ただし DispatcherServlet がview は前に呼び出されました。ここで ModelAndView で追加の処理を行うことができます。単純に考えると、コントローラーインターフェイスが呼び出された後に実行されると言えます。

実行チェーン内のこのメソッドの実行順序が逆になることに注意してください。つまり、最初に宣言されたインターセプターが後で実行されます。

afterCompletion

afterCompletion は、リクエストの処理後、つまりビューのレンダリング後に実行されます。通常、一部のリソースをクリーンアップし、preHandle と連携してインターフェイスの実行時間などを計算するために使用されます。

postHandle と同様に、実行チェーン内のこのメソッドの実行順序も逆になることに注意してください。つまり、最初に宣言されたインターセプターが後で実行されます。

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                            Object handler, @Nullable Exception ex) {
    // 请求完后,清除当前线程的用户信息
    UserContextHolder.removeUserContext();
}
ログイン後にコピー

インターセプターの登録

カスタム インターセプターを有効にするには、WebMvcConfigurer の実装クラスを通じて登録する必要があることに注意してください。

rree

以上がSpringBootインターセプタの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート