エディタ:
https://blog.csdn.net/cp026la/article/details/86501019
要約:
この章では、傍受された要求の違いを使用した簡単なスライシング、およびリスナーspringboot1.5を使用して、インターセプタ、フィルタを記述します
フィルター、インターセプターのコントラストは、スライスのリクエストをインターセプト:
同じポイント:リクエストを傍受することができます。
異なる点:
1、元の要求に応答して取得された唯一要求情報を遮断するフィルタ。
図2に示すように、要求をインターセプトするインターセプターは、元の要求、応答、およびコントローラとメソッド名の全てを取得することができるが、情報を得る方法ではありません。
3、アスペクトスライスが唯一の方法のパラメータを取得することができ、元の要求、応答が取得することはできません。
したがって、実際のプロジェクトでは、インターセプト要求における使用方法に応じて選択する必要があります。
フィルタ:
Filterインタフェースを達成するための1、
/ ** * @Auther:XF * @date:2018年11月19日夜7時30分 * @description:カスタムフィルタ * *フィルターのみリクエストを処理するコントローラの要求と応答を知らない得ることができます * / @ SLF4J 実装は、customFilterフィルタクラス{公共 @Override 公共ボイドのinit(に、FilterConfigに、FilterConfig)はServletExceptionが{スロー log.info( "フィルタの初期化を>>>>>>>"); } / ** *要求が傍受コールである場合 * / @Override 公共ボイドのdoFilter(のServletRequestのServletRequest、ServletResponseをServletResponseを、フィルターチェーンフィルターチェーンは)にIOException、ServletExceptionが{スロー log.info(「>>>>>>>>>>>>フィルタインターセプト要求処理ロジックを>>>>>>>>>>>>> "); >>>>>>>>>>「); //ビジネスロジック startTime =ロングのSystem.currentTimeMillis(); //フィルタチェイン、次のフィルタへ FilterChain.doFilter(のServletRequest、ServletResponseを); log.info( "要求時間:" +(のSystem.currentTimeMillis() -のstartTime))。 } @Override 公共ボイド破壊(){ log.info( "破壊>>>>>>>フィルタ"); } }
図2に示すように、フィルタ構成クラス:
従来のWebプロジェクトでは、フィルタ構成は、web.xmlに追加されます。SpringBoot FilterRegistrationBeanは、設定を完了する必要があります。
/ ** * @Auther:XF * @date:2018年11月19日夜7時58分 * @description:web.xmlに追加伝統的なプロジェクト構成フィルター *春ブーツで、我々はコンフィギュレーションにFilterRegistrationBeanを完了する必要があります * / @設定 パブリッククラスCustomFilterConfig { @Bean 公共FilterRegistrationBeanは、customFilter(){ FilterRegistrationBean登録新新FilterRegistrationBean =(); registration.setFilter(は、customFilter新新()); registration.addUrlPatterns( "/ *"); registration.setName( "は、customFilter"); registration.setOrder(1); 戻り登録; } }
3、ちょうどインターフェイステストの結果を要求し、プロジェクトを開始します。
そこコンソールログインターセプター。
図4に示すように、2つの方法のフィルタ構成:
@WebFilterによる直接コンフィギュレーション(CustomFilterConfig上方コメント構成タイプ)注釈
SLF4J @ 実行順序を指定するには、この注釈付きのフィルタ//複数の小さい第一実装 @Order(1) // @WebFilterはCustomFilterConfig内に配置されたコメント @WebFilter(urlPatterns =「/ *」 、FILTERNAME =「は、customFilter 「) 実装は、customFilterパブリッククラスフィルター{ ... }
注:
@WebFilterはServlet3.0ノルムで、SpringBootは提供に加え、指定されたパッケージ@ServletComponentScanコメントをスキャンする必要はありません。ここでは、起動クラスに追加しました。
//フィルタやサーブレット、リスナーのニーズが登録の役割を果たすために注釈を提供し、別、春のブートを使用するために登録するよう @ServletComponentScan //マッパーインタフェースクラススキャンパッケージ構成 @MapperScan(「com.coolron。*。ダオを 」 ) @SpringBootApplication(scanBasePackages = "com.coolron") パブリッククラスSpringbootApplication { ... }
第二に、インターセプタ:
1、カスタムインターセプタ1:
SLF4J @ 実装{からパブリッククラスMyInterceptor1 HandlerInterceptor @Override パブリックブールザpreHandle(HttpServletRequestのリクエスト、レスポンスHttpServletResponseの、オブジェクトハンドラ)が例外{スロー log.info(「>>> MyInterceptor1 >>>>>>>コール(コントローラ先行リクエスト処理)」)メソッド呼び出しの前に、 trueを返し、真//戻りのみ、下向き継続現在の要求リターン偽をキャンセルします } @Overrideは、 ザ・postHandle(HttpServletRequestのリクエストは、レスポンスは、オブジェクトハンドラ、HttpServletResponseの空公共 のModelAndViewのModelAndView)が例外をスロー{ ログ(「治療後に通話要求>>> MyInterceptor1 >>>>>>>後、しかしビューが(コントローラメソッド呼び出し)レンダリングされる前に」)の.info; } @Override ボイドafterCompletion公開(HttpServletRequestのリクエスト、レスポンスHttpServletResponseの、オブジェクトハンドラは、例外EX)は 例外{スロー log.info(「>>> MyInterceptor1 >>>>>>>全体要求、すなわち、対応するレンダリングのDispatcherServlet後に起動され(主にリソースのクリーンアップのための)ビューの実行後「); } }
2、カスタムインターセプタ2:
/ ** *カスタムインターセプタ2 * / @ SLF4J パブリッククラスMyInterceptor2 HandlerInterceptorが実装{から @Override パブリックブールザ・preHandle(HttpServletRequestのリクエスト、レスポンスのHttpServletResponse、オブジェクトハンドラ) 例外をスロー{ log.info(「>>> MyInterceptor2 >>>> >>>呼び出し要求処理に先立って)」(メソッドは、コントローラの前に呼び出されます); 戻り値がtrue; //戻り真のみ、リターン偽のは、現在の要求をキャンセルするには、下続ける } @Override ます。public void postHandle(リクエストのHttpServletRequest、HttpServletResponseの応答を、オブジェクトハンドラ のModelAndViewのModelAndView)は例外{スロー log.info(「>>> MyInterceptor2を>>>>>>>呼処理のために要求した後(コントローラー・メソッド呼び出しの後)が、ビュー)」がレンダリングされる前に、呼処理のために要求した後(コントローラー・メソッド呼び出しの後)が、ビュー)」がレンダリングされる前に; } @Override 公共ボイドafterCompletion(HttpServletRequestのリクエスト、レスポンスをHttpServletResponseの、オブジェクトハンドラ、例外EX)は 例外{スロー log.info(「>>> MyInterceptor2 >>>>>>>全体の要求の後に呼び出されると、すなわち、レンダリングのDispatcherServlet対応するビューを行った後「)(主にリソースをクリーンアップするために使用されます); } }
3、インターセプターの設定クラス:
/ ** * @Auther:XF * @date:2018年11月19日午後9時09分 * @description: * / @Configuration パブリッククラスInterceptorConfig延びWebMvcConfigurerAdapter { / * *インターセプタが配置 スプリングmvc.xmlプロファイルに* <MVC:インターセプター>追加タグはインターセプタを配置されています。 * / @Override 公共ボイドaddInterceptors(InterceptorRegistryレジストリ){ 鎖インターセプタインターセプタの//複数の 追加の規則をブロック// addPathPatterns // excludePathPatternsユーザ負インターセプト registry.addInterceptor(新しいMyInterceptor1を())。 AddPathPatterns( " /**").excludePathPatterns("/login "); 。registry.addInterceptor(新新MyInterceptor2())addPathPatterns(" / **「); super.addInterceptors(レジストリ); } }
三、アスペクトスライス傍受:
1、カスタムスライス:
/ ** * @description: *パラメータ値は、要求された特定のコントローラに対応する具体的なプロセスを得ることができるが、元の要求と応答を得ることができない * *ポイントカット(注) * 1、方法で作用 * 2何時間働く * *強化(法) * 1、ビジネスロジック機能が実行される * / //クラスの宣言スライス SLF4J @ @Aspect @Component パブリッククラスCustomAspect { //際に行った作業 // @Before( )インターセプタpreHandle()メソッドに対応する メソッドが応答を(傍受後// @Afterが行わ) //は、いくつかの異常時に呼び出さ@AfterThrowing方法スロー 最初の三つの周囲// @Aroundカバー //が呼を包囲します以下の方法 @Around( "実行(com.coolron *。*。* ...コントローラ。*(..))") // ProceedingJoinPointクラスはメソッドにいくつかの情報の現在傍受が含まれています メソッドオブジェクトパブリック(ProceedingJoinPoint PJP)のThrowable {スロー log.info( "=====アスペクトプロセス=======")、 オブジェクト[]引数= pjp.getArgs(); (Argのオブジェクト:引数)のために{ log.info( "パラメータ:"アルギニン+); } ロングSTART =のSystem.currentTimeMillis(); // chain.doFilterフィルタ()インターセプトオブジェクトを返す同じコントローラのメソッドの戻り値起動する方法の等価 (pjp.proceedオブジェクトオブジェクトを=) ; log.info( "処理アスペクト比:" +(のSystem.currentTimeMillis() -スタート)); リターンオブジェクト; } }
実行式を参照してくださいSpringBoot> 07 - トランザクション処理。
2、アクセス任意のインターフェイスを起動します。
コンソールを監視実行の順序をスライスし、フィルター、インターセプタが見つかりました:
インターセプト配列:フィルタ>>>インターセプタ>>>アスペクト>>>コントローラ
Ruoguo異常リターン結果:コントローラ>>>アスペクト(グローバル例外ハンドラに基づいて)>>> ControllerAdvice >>>インターセプタ>>>フィルタ
第四に、リスナー:
1、カスタムリスナー、インターフェースServletRequestListenerを実装
/ ** * @Auther:XF * @Date:2018年11月19日午後9時42分 * @description:监听器 * / @ SLF4J @WebListener パブリッククラスRequestListener実装ServletRequestListener { @Override ます。public void requestDestroyed(ServletRequestEvent servletRequestEvent){ ログ。情報( "监听器销毁>>>>>"); } @Override 公共ボイドrequestInitialized(ServletRequestEvent servletRequestEvent){ log.info( "监听器初始化>>>>>")。 } }
2、テスト:ログの初期化と破壊を確認するためにカジュアルなリスナーインターフェースを要求します。
注:ケースは、リスナーの要求を実現しています。作成および破棄するために使用されたリクエストオブジェクトを聞きます。
共通リスナー:
1、のHttpSessionListener:破壊、作成するために、セッションオブジェクトを聞いて
、2をServletRequestListenerを:破壊し、リスナーのリクエスト・オブジェクトを作成する
のServletContextListener、3:のServletContextは、リスナーオブジェクトの破壊を作成します