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 つのメソッドの実行シーケンス図は次のとおりです。
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
後処理は、HandlerAdapter
がプロセッサを呼び出した後、ただし DispatcherServlet
がview は前に呼び出されました。ここで ModelAndView
で追加の処理を行うことができます。単純に考えると、コントローラーインターフェイスが呼び出された後に実行されると言えます。
実行チェーン内のこのメソッドの実行順序が逆になることに注意してください。つまり、最初に宣言されたインターセプターが後で実行されます。
afterCompletion は、リクエストの処理後、つまりビューのレンダリング後に実行されます。通常、一部のリソースをクリーンアップし、preHandle と連携してインターフェイスの実行時間などを計算するために使用されます。
postHandle と同様に、実行チェーン内のこのメソッドの実行順序も逆になることに注意してください。つまり、最初に宣言されたインターセプターが後で実行されます。
@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) { // 请求完后,清除当前线程的用户信息 UserContextHolder.removeUserContext(); }
カスタム インターセプターを有効にするには、WebMvcConfigurer
の実装クラスを通じて登録する必要があることに注意してください。
以上がSpringBootインターセプタの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。