ホームページ  >  記事  >  Java  >  SpringBootインターセプタの使い方

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

王林
王林転載
2023-05-16 13:01:061699ブラウズ

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 までご連絡ください。