インターセプトフィルタパターン

インターセプティングフィルターは、コアとなるリクエスト処理コードを変更することなく、一般的なサービスを標準的な方法で処理するためのプラグ可能なフィルターを作成するJavaEEパターンです。これらのフィルターは、受信リクエストと送信レスポンスをインターセプトすることで前処理と後処理を可能にし、既存のコードを変更することなく、目立たないように追加または削除できます。 [ 1 ] このパターンは、フロントコントローラとページコントローラによる実際のリクエスト実行の前後に、再利用可能な処理を透過的に適用します。[ 2 ]

構造

フィルター マネージャー、フィルター チェーン、フィルター、およびターゲットは、パターンのコンポーネントです。

フィルターマネージャー

これはフィルタ処理を管理し、適切なフィルタを正しい順序でフィルタチェーンを作成し、処理を開始します。[ 1 ]

フィルターチェーン

フィルタチェーンは、論理的なチェーンを形成するように構成された特定のフィルタのシリーズです。[ 1 ]

フィルター

これらはターゲットにマッピングされた個々のフィルタであり、その処理はフィルタチェーンによって調整されます。[ 1 ]

ターゲット

これはクライアントが要求したリソースです。[ 1 ]

結果

次のような利点が考えられます。

  • 再利用性の向上: 共通コードはプラグ可能なコンポーネントに集中化され、再利用性が向上します。
  • 柔軟性の向上:汎用的な共通コンポーネントを宣言的に適用および削除できるため、柔軟性が向上します。[ 1 ] [ 2 ]

不必要に長いインターセプターとフィルターのチェーンはパフォーマンスを低下させる可能性があるため、パフォーマンスの低下が懸念される。[ 2 ]

サンプルコード

カスタム フィルター戦略を使用したフィルターのサンプル コード実装を以下に示します。

フィルターを実装するためのコード - フィルターのデバッグ:

java.io.IOExceptionをインポートしますjavax.annotation.processing.Processorをインポートしますjakarta.servlet.ServletExceptionをインポートします。jakarta.servlet.ServletRequestインポートします。jakarta.servlet.ServletResponseインポートしますパブリッククラスDebuggingFilter はProcessorを実装します{プライベートProcessorターゲット;パブリックデバッグフィルタ(プロセッサmyTarget ) {ターゲット= myTarget ; }public void execute ( ServletRequest req , ServletResponse res ) throws IOException , ServletException { // ここで、リクエストパラメータの表示などのフィルタ処理を実行します。target . execute ( req , res ); } }

[ 1 ]

フィルタを実装するためのコード - コアプロセッサ:

java.io.IOExceptionをインポートしますjavax.annotation.processing.Processorをインポートしますjakarta.servlet.ServletExceptionをインポートします。jakarta.servlet.ServletRequestインポートします。jakarta.servlet.ServletResponseインポートしますパブリッククラスCoreProcessor はProcessorを実装します{プライベートProcessorターゲット;パブリックCoreProcessor () { this ( null ); }パブリックCoreProcessor (プロセッサmyTarget ) {ターゲット= myTarget ; }public void execute ( ServletRequest req , ServletResponse res ) throws IOException , ServletException { // ここでコア処理を実行します} }

[ 1 ]

リクエストを処理するためのコード:

java.io.IOExceptionをインポートしますjavax.annotation.processing.Processorをインポートしますjakarta.servlet.ServletExceptionをインポートします。jakarta.servlet.ServletRequestインポートします。jakarta.servlet.ServletResponseインポートしますpublic void processRequest ( ServletRequest req ServletResponse res ) throws IOException ServletException { Processor processors = new DebuggingFilter ( new AuthenticationFilter ( new CoreProcessor ())) ; processors.execute ( req res ) ;// 次に、次のリソース (おそらく表示する View)ディスパッチします。dispatcher.dispatch ( req , res ); }

[ 1 ]

フィルター マネージャーのコード:

java.io.IOExceptionをインポートしますjavax.annotation.processing.Processorをインポートしますjakarta.servlet.ServletExceptionをインポートします。jakarta.servlet.ServletRequestインポートします。jakarta.servlet.ServletResponseインポートしますpublic void processRequest ( ServletRequest req ServletResponse res ) throws IOException ServletException { Processor processors = new DebuggingFilter ( new AuthenticationFilter ( new CoreProcessor ())) ; processors.execute ( req res ) ;// 次に、次のリソース (おそらく表示する View)ディスパッチします。dispatcher.dispatch ( req , res ); }

[ 1 ]

フィルタチェーンのコード:

インポートjakarta.servlet.Filter ;public class FilterChain { // フィルターチェーン// フィルターを適用しますfor ( final Filter filter : filters ) { // リクエストとレスポンスをさまざまなフィルターに渡しますfilter . execute ( request , response ); } } }

[ 1 ]

参照

参考文献

  1. ^ a b c d e f g h i j k「コア J2EE パターン - インターセプト フィルタ」 . Oracle . Oracle . 2016年2月6日閲覧
  2. ^ a b c Kayal, D. (2008). Pro Java EE Spring Patterns . ニューヨーク: Apress. pp.  98– 106.