preHandle: 前処理、ターゲットのコントローラーメソッドが実行される前の処理
postHandle: ターゲットのコントローラー内メソッド コントローラー メソッドの実行後、指定されたページに到達する前に処理されます。
afterCompletion: ページがレンダリングされた後に処理されます
# #Method:
1. Springboot は HandlerInterceptor インターフェイスを実装することでインターセプターを実装します 2. WebMvcConfigurer を通じて構成クラスを実装し、それを@Configuration アノテーション 3 .インターセプト ルールを指定しますユーザー ログインを例にとると、ユーザーがログインしておらず、セッションにユーザー データがない場合、次のようになります。ホームページのログイン ページにリダイレクトされます。正しくログインした後、リリスターをセッションに保存します。ページに再度アクセスすると、ログイン インターセプターがリリスター オブジェクトを見つけることができるため、ログイン インターフェイスをインターセプトする必要はありません。
package com.zwz.springbootweb.interceptor; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.websocket.Session; public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object reglister = session.getAttribute("Reglister"); if (reglister != null) { return true; } else { request.setAttribute("msg", "请先登录!"); request.getRequestDispatcher("/").forward(request,response); return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }次に、WebMvcConfigurer インターフェイスを実装して構成クラスを実装し、インターセプターを構成クラスに挿入し、最後に@Configuration アノテーションを使用して設定を行い、インターセプト パスと解放する必要があるパスを指定します。Note:
Interceptor /** は、静的リソースを含むすべてのリソースをインターセプトします。静的リソースは、静的リソースを含める必要があります。リリース済み
package com.zwz.springbootweb.config; import com.zwz.springbootweb.interceptor.LoginInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.util.UrlPathHelper; @Configuration public class WebConfig implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/loginjudge","/","/retolo","/static/**"); } }
Interceptor Application scenarios
1. ロギング: 情報監視、情報のリクエスト情報のログを記録します。統計、PV(Page VIEW)の計算など2. 権限チェック: ログイン検出など、プロセッサーに入ってログインしているかどうかを検出し、ログインしていない場合は直接ログイン ページに戻ります; 3. パフォーマンス監視: 場合によっては、システムが一定期間中に不可解な動作をする場合は、インターセプタを使用してプロセッサに入る前の開始時刻を記録し、処理後の終了時刻を記録して、リクエストの処理時間を取得できます(リクエストがある場合)。 Apache などのリバース プロキシである場合は、自動的に記録できます); 4. 一般的な動作: Cookie を読み取ってユーザー情報を取得し、その後の使用を容易にするためにユーザー オブジェクトをリクエストに組み込みます。プロセスの抽出、ロケールやテーマ情報の抽出など、複数のプロセッサで必要な場合は、インターセプタを使用して実装できます。 5. OpenSessionInView: Hibernate と同様に、プロセッサに入る前に SESSION を開き、完了後に SESSION を閉じます。インターセプターとフィルターの違い
1. インターセプターは Java のリフレクション メカニズムに基づいており、フィルターは関数コールバックに基づいています。 2. インターセプターはサーブレット コンテナーに依存しませんが、フィルターはサーブレット コンテナーに依存します。 3. インターセプターは ACTION リクエストに対してのみ機能しますが、フィルターはほぼすべてのリクエストに対して機能します。 4. インターセプターは ACTION コンテキストおよび値スタック内のオブジェクトにアクセスできますが、フィルターはアクセスできません。 5. ACTION のライフサイクルでは、インターセプターは複数回呼び出すことができますが、フィルターはコンテナーの初期化時に 1 回しか呼び出すことができません。 6. インターセプターは IOC コンテナ内の各 Bean を取得できますが、フィルターは取得できません。これは非常に重要です。インターセプターにサービスを挿入すると、ビジネス ロジックを呼び出すことができます。以上がSpringbootにインターセプタ機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。