コアJ2EEパターン - Intercepting Filterパターン
2008/06/29 23:07Update
Intercepting Filterパターンは コアJ2EEパターン の一つです。Interceptingは「横取り」との意味で、そしてIntercepting Filterパターンは、フィルターでリクエスト/レスポンスを横取りして、リクエストとレスポンスの前後で認証、セッション管理などの共通処理を行うパターンです。
本文は「問題」、「解決策」、「戦略」、「メリット」、「実装例」などからIntercepting Filterパターンについて説明します。
プレゼンテーション層はクライアントからの様々なリクエスト(request)を受け取って処理しなければなりません。場合によって、これらのリクエスト/レスポンスの前後に、リクエストを拒否したり、ログなどの処理をしたり、リクエストを次の処理にそのまま投げたりすることがあります。次のような処理は必要があるかを確認してください。
◇ クライアントが認証されているか。
◇ クライアントは正確なセッションであるか。
◇ クライアントの IP アドレスは信頼されているか。
◇ クライアントが使用するエンコードは何か。
◇ クライアントが使用するブラウザはサポートされているか。
これらの原因で、リクエスト/レスポンスの前処理・後処理が必要になります。
保守性と拡張性を求めたシステムでは、これらの共通処理をどこでどうやって書くべきなのでしょうか。
Intercepting Filterパターンは、これらの問題を解決します。
Create pluggable filters to process common services in a standard manner without requiring changes to core request processing code. The filters intercept incoming requests and outgoing responses, allowing preprocessing and post-processing. We are able to add and remove these filters unobtrusively, without requiring changes to our existing code.
複数フィルタを作成することによって、コアコードを修正せずに、共通する処理を柔軟に追加・修正ができます。これらのフィルタはすべてのリクエストとレスポンスを横取りして、共通する前処理及び後処理を行います。また、既存のコードを修正することなく、フィルタの定義を追加することだけで、共通する処理を追加したり削除したりすることができます。
◇ 認証
◇ ページのナビゲーション
◇ セッション管理
◇ ローカリゼーション
◇ ログ
Intercepting Filterパターンのアーキテクチャは次の通りです。
<<図>>

FilterManager
フィルタ処理を管理するクラスです。正しい順で適切なFilterChainを作成し、フィルタ処理を開始します。
FilterChain
フィルタのチェーン(集合)で、記述された順番でフィルタを実行します。
FilterOne,FilterTwo,FilterThree
独立した個々のフィルタで、request/responseの前処理及び後処理を行います。FilterChainがこれらのフィルタを管理/実行します。
Target
クライアントが要求したターゲットリソースです。
Intercepting Filterパターンは複数の実装戦略があります。
Custom Filter Strategy(カスタムFilter戦略)
フィルタフレームワークのFilterManager、FilterChain、個々のFilterなどをすべて自分で実現することです。
Standard Filter Strategy(標準Filter戦略)
J2EE(SERVLET 2.3)標準では、Intercepting Filterパターンの標準実装を定義しています。FilterManager及びFilterChainはJ2EE標準をサポートするWEBコンテナーに実現されています。なので、javax.servlet.Filterから継承するクラスを実装するだけでIntercepting Filterパターンが実装されることになります。
また、これに基づいて、オブジェクトの抽象、継承などの手法によって、Base Filter StrategyやTemplate Filter Strategyなどの戦略もあります。
例えば、Apache Tomcatウェブサーバでは、org.apache.catalina.core.StandardWrapperValveはFilterManager役で、org.apache.catalina.core.ApplicationFilterChainはFilterChain役となります、J2EE標準をサポートしているため、実装の詳細を知る必要がありません。
◇ 再利用性の向上。個々のフィルタは完全に独立しているので、再利用をしやすくなります。
◇ 拡張性の向上。各機能の変更がそれに関連するフィルタだけを修正すればよい、他のリソースを修正する必要がありません。また、機能の追加にも新しいフィルタを追加するだけで済みことになります。
◇ 保守性の向上。設定ファイルの設定により、簡単にフィルタを追加したり、削除したりすることができますので、保守しやすくなります。
Intercepting FilterパターンのStandard Filter Strategy(標準Filter戦略)の実装は非常に簡単であり、javax.servlet.Filterインタフェースを実装し、web.xmlにフィルタを追加するだけです。
Front Controller(コアJ2EEパターンのFront Controllerパターン)
ControllerはIntercepting Filterと類似する問題を解決しますが、Controllerはコア処理を集中して制御することに適しています。
Decorator [GoF] (GoFデコレータパターン)
Intercepting FilterパターンをGoFのDecoratorパターンで実装することができます。
Template Method [GoF](GoFテンプレートメソッドパターン)
Intercepting FilterパターンをGoFのTemplate Methodパターンで実装することができます(the Template Filter Strategy)。
Interceptor [POSA2]
The Intercepting Filter pattern is related to the Interceptor pattern, which allows services to be added transparently and triggered automatically.
Pipes and Filters [POSA1]
The Intercepting Filter pattern is related to the Pipes and Filters pattern.
Core J2EE Pattern Catalog 
Core J2EE Patterns - Intercepting Filter
問題
プレゼンテーション層はクライアントからの様々なリクエスト(request)を受け取って処理しなければなりません。場合によって、これらのリクエスト/レスポンスの前後に、リクエストを拒否したり、ログなどの処理をしたり、リクエストを次の処理にそのまま投げたりすることがあります。次のような処理は必要があるかを確認してください。
◇ クライアントが認証されているか。
◇ クライアントは正確なセッションであるか。
◇ クライアントの IP アドレスは信頼されているか。
◇ クライアントが使用するエンコードは何か。
◇ クライアントが使用するブラウザはサポートされているか。
これらの原因で、リクエスト/レスポンスの前処理・後処理が必要になります。
保守性と拡張性を求めたシステムでは、これらの共通処理をどこでどうやって書くべきなのでしょうか。
Intercepting Filterパターンは、これらの問題を解決します。
解決策
Create pluggable filters to process common services in a standard manner without requiring changes to core request processing code. The filters intercept incoming requests and outgoing responses, allowing preprocessing and post-processing. We are able to add and remove these filters unobtrusively, without requiring changes to our existing code.
複数フィルタを作成することによって、コアコードを修正せずに、共通する処理を柔軟に追加・修正ができます。これらのフィルタはすべてのリクエストとレスポンスを横取りして、共通する前処理及び後処理を行います。また、既存のコードを修正することなく、フィルタの定義を追加することだけで、共通する処理を追加したり削除したりすることができます。
◇ 認証
◇ ページのナビゲーション
◇ セッション管理
◇ ローカリゼーション
◇ ログ
Intercepting Filterパターンのアーキテクチャは次の通りです。
<<図>>
FilterManager
フィルタ処理を管理するクラスです。正しい順で適切なFilterChainを作成し、フィルタ処理を開始します。
FilterChain
フィルタのチェーン(集合)で、記述された順番でフィルタを実行します。
FilterOne,FilterTwo,FilterThree
独立した個々のフィルタで、request/responseの前処理及び後処理を行います。FilterChainがこれらのフィルタを管理/実行します。
Target
クライアントが要求したターゲットリソースです。
戦略
Intercepting Filterパターンは複数の実装戦略があります。
Custom Filter Strategy(カスタムFilter戦略)
フィルタフレームワークのFilterManager、FilterChain、個々のFilterなどをすべて自分で実現することです。
Standard Filter Strategy(標準Filter戦略)
J2EE(SERVLET 2.3)標準では、Intercepting Filterパターンの標準実装を定義しています。FilterManager及びFilterChainはJ2EE標準をサポートするWEBコンテナーに実現されています。なので、javax.servlet.Filterから継承するクラスを実装するだけでIntercepting Filterパターンが実装されることになります。
また、これに基づいて、オブジェクトの抽象、継承などの手法によって、Base Filter StrategyやTemplate Filter Strategyなどの戦略もあります。
例えば、Apache Tomcatウェブサーバでは、org.apache.catalina.core.StandardWrapperValveはFilterManager役で、org.apache.catalina.core.ApplicationFilterChainはFilterChain役となります、J2EE標準をサポートしているため、実装の詳細を知る必要がありません。
メリット
◇ 再利用性の向上。個々のフィルタは完全に独立しているので、再利用をしやすくなります。
◇ 拡張性の向上。各機能の変更がそれに関連するフィルタだけを修正すればよい、他のリソースを修正する必要がありません。また、機能の追加にも新しいフィルタを追加するだけで済みことになります。
◇ 保守性の向上。設定ファイルの設定により、簡単にフィルタを追加したり、削除したりすることができますので、保守しやすくなります。
実装する例
Intercepting FilterパターンのStandard Filter Strategy(標準Filter戦略)の実装は非常に簡単であり、javax.servlet.Filterインタフェースを実装し、web.xmlにフィルタを追加するだけです。
関連するパターン
Front Controller(コアJ2EEパターンのFront Controllerパターン)
ControllerはIntercepting Filterと類似する問題を解決しますが、Controllerはコア処理を集中して制御することに適しています。
Decorator [GoF] (GoFデコレータパターン)
Intercepting FilterパターンをGoFのDecoratorパターンで実装することができます。
Template Method [GoF](GoFテンプレートメソッドパターン)
Intercepting FilterパターンをGoFのTemplate Methodパターンで実装することができます(the Template Filter Strategy)。
Interceptor [POSA2]
The Intercepting Filter pattern is related to the Interceptor pattern, which allows services to be added transparently and triggered automatically.
Pipes and Filters [POSA1]
The Intercepting Filter pattern is related to the Pipes and Filters pattern.
参考資料
Core J2EE Pattern Catalog 
Core J2EE Patterns - Intercepting Filter
Sponsored Link
- Relative Articles
- ASP.NETでのフロント・コントローラ(Front Controller)実装 - (2009/10/20 15:22)
- Factory Method パターン - ファクトリメソッドパターン - (2008/06/09 22:44)
- Abstract Factory パターン - 抽象ファクトリパターン - (2008/06/10 13:25)
- Singleton パターン - シングルトンパターン - (2008/06/10 15:36)
- Prototypeパターン - プロトタイプパターン - (2008/06/10 17:23)
- Builderパターン - ビルダーパターン - (2008/06/10 19:01)
- Adapter パターン - アダプターパターン - (2008/06/11 11:30)
- Composite パターン - コンポジットパターン - (2008/06/11 16:59)
- Interpreter パターン - インタプリタパターン - (2008/06/13 15:42)
- Chain of Responsibility パターン - 責任の連鎖パターン - (2008/06/14 00:28)