インターセプトフィルタパターン
インターセプティングフィルターは、コアとなるリクエスト処理コードを変更することなく、一般的なサービスを標準的な方法で処理するためのプラグ可能なフィルターを作成する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 ); } }フィルタを実装するためのコード - コアプロセッサ:
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 { // ここでコア処理を実行します} }リクエストを処理するためのコード:
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 ); }フィルター マネージャーのコード:
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 ); }フィルタチェーンのコード:
インポートjakarta.servlet.Filter ;public class FilterChain { // フィルターチェーン// フィルターを適用しますfor ( final Filter filter : filters ) { // リクエストとレスポンスをさまざまなフィルターに渡しますfilter . execute ( request , response ); } } }