Javaのインターセプタ例を詳しく解説

Y2J
リリース: 2017-05-10 10:32:58
オリジナル
2792 人が閲覧しました

この記事では、Spring Boot インターセプターの簡単な使用例コードを主に紹介します。必要な方は参考にしてください。 meChange インターセプター

LocaleChangeInterceptor と ThemeChangeInterceptor がより一般的に使用されます。

2. カスタム インターセプターの実装には 3 つの手順のみが必要です:




1)、独自のインターセプター クラスを作成し、HandlerInterceptor
インターフェース
を実装します。

2)、

WebMvcConfigurerAdapter を継承する Java クラスを作成し、addInterceptors メソッドをオーバーライドします。

3)、カスタム インターセプターをインスタンス化し、オブジェクトをインターセプター チェーン (addInterceptors メソッドで追加) に手動で追加します。

3. コード例

IndexInterceptor.java クラス コード:

package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class IndexInterceptor implements HandlerInterceptor{
  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
  }
  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
  }
  @Override
  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
     System.out.println(">>>IndexInterceptor>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
     // 只有返回true才会继续向下执行,返回false取消当前请求
     return true;
  }
}
ログイン後にコピー
IndexInterceptor2.java クラス コード:
package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class IndexInterceptor2 implements HandlerInterceptor{
  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
  }
  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
      throws Exception {
    System.out.println(">>>IndexInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
  }
  @Override
  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
     System.out.println(">>>IndexInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
     // 只有返回true才会继续向下执行,返回false取消当前请求
     return false;
  }
}
ログイン後にコピー

SimpleWebAppConfigurer.java クラス コード:

package com.example.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.example.interceptor.IndexInterceptor;
import com.example.interceptor.IndexInterceptor2;
//只要能被springboot扫描到即可
@Configuration
public class SimpleWebAppConfigurer extends WebMvcConfigurerAdapter{
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 多个拦截器组成一个拦截器链
    // addPathPatterns 用于添加拦截规则
    // excludePathPatterns 用户排除拦截
    registry.addInterceptor(new IndexInterceptor()).addPathPatterns("/**");
    registry.addInterceptor(new IndexInterceptor2()).addPathPatterns("/**");
    super.addInterceptors(registry);
  }
}
ログイン後にコピー

4.解析命令

preHandle**: プロセッサの前処理 (ログイン チェックなど) を実装する前処理コールバック メソッド。3 番目のパラメーターは応答プロセッサ (前の章のコントローラー実装など) です。

戻り値: true はプロセスを続行することを意味します (呼び出しなど)。次のインターセプターまたはプロセッサー);

false は、プロセスが中断され (ログインチェックの失敗など)、現時点では他のインターセプターまたはプロセッサーの呼び出しを続行しないことを意味します。 **: プロセッサの後処理を実装する後処理コールバック メソッド (ただしビューをレンダリングする前)。この時点で、modelAndView (

モデル

およびビュー

オブジェクト ) を介してビューを処理できます。 .modelAndView は null である場合もあります。

afterCompletion**: リクエスト全体が処理された後のコールバック メソッド。つまり、ビューがレンダリングされるときにコールバックされます。たとえば、パフォーマンス監視では、ここで終了時間を記録し、消費時間を出力できます。また、finally の try-catch-finally と同様に、リソースのクリーンアップを実行することもできますが、プロセッサ実行チェーンで preHandle が true を返すインターセプタの afterCompletion** のみが呼び出されます。

【関連おすすめ】

1.

Javaの無料ビデオチュートリアル

2. FastJsonのチュートリアルマニュアル

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

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