、(フィルター)とインターセプター(インターセプタ)一般的に使用されたWebプロジェクトの二つの機能をフィルタする記事を簡単にフィルタの使用を説明し、春のブートコントローラがメソッドの期間、および両方の単純な比較を計算するために行わインターセプタ違い。
既存のコントローラーを、次のとおりです。
@RestController
@RequestMapping( "ユーザ")
パブリッククラスUserControllerで{ @GetMapping( "/ {ID:\\のD +}") 公共ボイドのget(@PathVariable文字列ID){ のSystem.out.println(ID)。 } }
以下は、フィルタの構成とインターセプタによって達成されるのget メソッド実行時間算出機能。
フィルタ
定義のTimeFilterの実装クラスは、javax.servlet.Filterを:
パブリッククラスのTimeFilterフィルタを実装{
@Override
公共ボイドのinit(に、FilterConfigに、FilterConfig)はServletExceptionが{スロー
するSystem.out.printlnは( "过滤器初始化")。
} @Override 公共ボイドのdoFilter(のServletRequestのServletRequest、ServletResponseをServletResponseを、フィルターチェーンれるFilterChainは)にIOException、ServletExceptionが{スロー するSystem.out.printlnを( "开始执行过滤器")。 ロングスタート=新しいDate()getTime(); filterChain.doFilter(のServletRequest、ServletResponseを)。 System.out.println( "【过滤器】耗时" +(新しい日付()getTime() - )を起動します。); System.out.println( "结束执行过滤器"); } @Override {)(破壊公共ボイド
System.out.println( "フィルタ破壊");
}
}
TimeFilterの書き換えフィルターに3つの方法が、この方法は非常に簡単な名前はここではそれらを繰り返さないで、その役割を説明してきました。
フィルタ効果の春ブーツを作るために、いくつかの構成が必要です。二つの主要な構成があります。
コンフィギュレーション
これは、することにより調製することができるのTimeFilter 以下に注釈を追加します:
@Component
@WebFilter(urlPatternsが= { "/ *"は})
パブリッククラスのTimeFilterフィルタを実装{
...
}
@Component 注釈ができますTimeFilterのは、豆Springコンテキストになり、@WebFilter 注釈urlPatterns フィルタへのアクセスを要求することができますプロパティの設定は、/ * すべての要求を表します。
プロジェクトを開始すると、コンソール出力見ることができるフィルタが初期化され、開始アクセス、HTTPを:// localhostを:8080 /ユーザー/ 1は次のように、コンソール出力は次のようになります。
始めのフィルタ
1
[フィルタ] 31かかりましたが
、フィルタの実行を終了します
第二の方法の設定
フィルタクラスに指摘されている場合を除き、私たちもできるFilterRegistrationBean フィルタを登録します。
定義のWebConfig クラスを、プラス@Configuration クラスのその構成を示すコメント、そしてFilterRegistrationBean フィルターを登録します。
@Configuration
パブリッククラスのWebConfig {
@Bean
公共FilterRegistrationBeanのTimeFilter(){
FilterRegistrationBean filterRegistrationBean =新しいFilterRegistrationBean()。
TimeFilterのTimeFilter =新しいのTimeFilter();
filterRegistrationBean.setFilter(のTimeFilter); リスト<文字列> urlList =新しいArrayListを<>(); urlList.add( "/ *"); filterRegistrationBean.setUrlPatterns(urlList)。 filterRegistrationBeanを返します。 } }
FilterRegistrationBean フィルタ登録に加えのTimeFilterを介して外部setUrlPatternsは、規則マッチング法URLを配置しました。プロジェクト再起動するアクセス// localhostを::HTTP 8080 /ユーザー/ 1を、我々は、上記と同様の効果を見ることができます。
私たちは、フィルタを介してのServletRequestオブジェクトを取得することができ、そのためには、メソッドの名前に付加的な情報を得ることができない、クラスに属し、およびその他のパラメータ。
迎撃機
定義TimeInterceptorの実装クラスorg.springframework.web.servlet.HandlerInterceptor インタフェース:
パブリッククラスTimeInterceptorが実装HandlerInterceptor {
@Override
パブリックブールpreHandle(HttpServletRequestのHttpServletRequestを、HttpServletResponseのHttpServletResponseの、オブジェクトo)は例外{スロー
するSystem.out.println( "处理拦截之前を");
httpServletRequest.setAttribute(。 "のstartTime"、新しいDate()getTime());
System.out.println(((HandlerMethod)O).getBean()のgetClass()のgetName());
System.out.println(((HandlerMethod)O).getMethod()のgetName()。)。
trueを返します。
} @Override 公共ボイドpostHandle(HttpServletRequestのHttpServletRequestを、HttpServletResponseのHttpServletResponseの、オブジェクトo、のModelAndViewのModelAndViewは){例外をスロー
System.out.println( "ノックダウンの処理を開始");
ロングスタート=(ロング)httpServletRequest.getAttribute( "のstartTime");
System.out.printlnは( "[]加工インターセプター" +(新しい日付()getTime 。 () - START));
} @Override 公共ボイドafterCompletionは(のHttpServletRequestのHttpServletRequest、HttpServletResponseのHttpServletResponseの、オブジェクトO、例外E)は例外{スロー ;のSystem.out.println() "ノックダウン処理した後、" ロングスタート=(ロング)のHttpServletRequest .getAttribute( "のstartTime"); System.out.printlnは( "[]加工インターセプター" +(新しい新しい日付()getTime() -スタート)。); System.out.printlnは( "例外情報" + E) ; } }
TimeInterceptorは実現HandlerInterceptor 3インターフェイスのメソッドを。preHandle 処理の前に実行を傍受する方法は、postHandleは、メソッドが正常に例外処理がスローされません傍受場合のみ、afterCompletionの方法にかかわらず、法の例外がスローされたり、実行されるわけではありません傍受しました。
パラメータは、フィルタ、インターセプタよりオブジェクト例外オブジェクトと比較して、これらの三つの方法を介して見ることができるので、情報はフィルタよりはるかに取得することができます。しかし、まだフィルタパラメータ情報およびその他の方法を得ることができない、我々は、具体的に参照し、セクションのプログラミングによってこれを達成することができますhttps://mrbird.cc/Spring-Boot-AOP%20log.html 。
次のように春のブート迎撃を行うために、コンフィギュレーションは、2つのステップが必要です。
1.インターセプタクラスの追加@Component 注釈を。
2. WebConfigのことでInterceptorRegistryのフィルタ登録:
@Configuration
パブリッククラスのWebConfigはWebMvcConfigurerAdapter {延び
@Autowired
プライベートTimeInterceptor timeInterceptorと、 @Override 公共ボイドaddInterceptors(InterceptorRegistryレジストリ){ registry.addInterceptor(timeInterceptor)。 } }
プロジェクト、訪問の開始HTTPを:// localhostを:8080 /ユーザー/ 1 、次のようにコンソール出力は次のようになります。
治療傍受する前に
cc.mrbird.controller.UserController
GET
1つの
スタート処理インターセプタ
[インターセプター] 24を消費する
インターセプタを処理した後
、[インターセプター]は24の取っ
ヌル異常を
出力から、我々は三つの方法、および3つの方法の実行順序が実行されていることがわかります。
我々UserControllerでの取得マニュアルメソッドは例外をスローします。
@GetMapping( "/ {ID:\\のD +}")
公衆ボイドGET(@PathVariable文字列ID){
のSystem.out.println(ID)。
(「ユーザーは存在しません」)新しいのRuntimeExceptionを投げます。
}
プロジェクトを再起動した後、訪問HTTPを:// localhostを:8080 /ユーザー/ 1 、次のようにコンソール出力は次のようになります。
治療インターセプト前
cc.mrbird.controller.UserController
GET
1
インターセプタを処理した後
、[インターセプター]は0をとる
例外情報java.lang.RuntimeException:ユーザーが存在しません
見ることができpostHandleのメソッドが実装されていません。
実行タイミング比較
私たちは、フィルタリングし、インターセプタが設定されているし、プロジェクトの訪問を開始HTTPを:// localhostを:8080 /ユーザー/ 1 :
始めフィルタ
切片を処理する前に
cc.mrbird.controller.UserController
GET
1つの
スタート処理インターセプタ
[インターセプター]が25を取った
インターセプタを処理した後
、[インターセプター]は25取っ
情報ヌル異常
[フィルタ]を34にかかる
フィルタ端を実行します
フィルタは、インターセプターの端部よりも後で実行最初のインターセプターで見ることができます。さて、図の下に、それらの実行時間差を説明しました。