1.Intercepting Filter パターン
J2EEパターン 1章 Intercepting Filter パターン
1.1 Intercepting Filter パターンとは
Intercepting Filter パターンとはどういうものか、目的、概要、構造とわけて説明していきます。
目的
Webアプリケーションを構築する場合、ある程度、どのリソースでも行いたい処理というものが出てきます。たとえば以下のようなものがあげられます。
- 認証の確認
- リクエストパスの制約
- エンコーディングの確認
- クライアント(ブラウザ)情報の確認
これらの共通する処理をそれぞれのリソースでコーディングすると、同じコードを何度も記述しなければならず、無駄な作業が必要となります。また、共通部分をコピーアンドペーストで作成されたソースは、メンテナンスの面でも、保守しにくいアプリケーションになってしまいます。どういうことかと言うと、共通する処理内容や処理方法などを修正・変更したい場合、その処理を行っているリソースすべてを変更しなければならないからです。その結果、保守性や拡張性に乏しいアプリケーションになってしまいます。この問題を解決するために考えられたのが、Intercepting
Filter パターンです。
概要
Intercepting Filter パターンの、概要を説明していきます。
まず、Webアプリケーションで共通する処理を洗い出し、それらを1つずつ独立性の高いフィルタとして作成します。フィルタは入力リクエストと出力レスポンスを横取りし、前処理、後処理を施します。そして、各リソースへのフィルタの追加・削除は設定ファイルを変更することにより実現します。その際、既存のソースコードは変更する必要がありません。
構造
Intercepting Filter パターンの構造を示します。
もともとWebアプリケーションは次のような構造になっています。

共通する処理を各Targetで行うのでは、保守性、拡張性に乏しいアプリケーションになってしまうことは、目的のところで述べたとおりです。そこで、共通する処理をフィルタで行えるように、リクエストとレスポンスをFilterManagerが横取りして、必要な処理を行うフィルタを順番にかけていきます。各フィルタは設定ファイルを変更することで、いくつでもフィルタを連携させて処理することが可能です。

- FilterManager
- FilterManagerはフィルタ処理を管理します。正しい順序で適切なフィルタのFilterChainを作成し、処理を開始します。
- FilterChain
- FilterChainは独立したフィルタの順序集合です。
- FilterOne,FilterTwo,FilterThree
- これらはTargetにマッピングされた個々のフィルタです。FilterChainがこれらの処理を調整します。
- Target
- Targetはクライアントが要求したりソースです。
1.2 メリット
Intercepting Filter パターンには次のようなメリットがあります。
- 再利用性が向上する
フィルタそのものが独立性の高いクラスなので、他のリソースにも利用でき、さらに他のWebアプリケーションでも利用できます。
- 拡張性が向上する
いろいろなリソースに共通処理をコーディングしていると、その処理を修正したい場合はすべてのページを修正しなければならず、非常に煩雑ですが、Intercepting
Filter パターンを利用していれば、フィルタクラスを変更するだけで、そのフィルタを利用しているリソースすべてに修正が反映されます。
- フィルタの追加・削除が容易である
どのページにどのフィルタをかけるか、設定ファイルで設定できるので、ソースコードを変更する必要はありません。
1.3 実装例
Intercepting Filter パターンの実装例ですが、J2EEには、javax.servlet.Filter(サーブレットフィルタ)クラスが用意されています。
javax.servlet.Filterクラスは、Servlet ver.2.3以降で利用可能です。Filterクラスは、フィルタを作成するためのインターフェースとなります。
サーブレットコンテナにTomcat4.1.30を利用した場合、以下のような構成となります。

- FilterManager
- org.apache.catalina.core.StandardWrapperValveクラスがFilterManagerとして働きます。まず、FilterChainを作成します。その後、FilterChainのdoFilterメソッドを呼び出し、処理を開始します。そして、FilterChainに登録されたFilterがすべて処理されたら、Targetへリクエストを渡します。
- FilterChain
- org.apache.catalina.core.ApplicationFilterChainクラスがFilterChainとして働きます。各FilterクラスのdoFilterメソッドを呼び、実行します。
- Filter
- 上図の例では、AccessLogFilter,EncodingFilter,ExceptionCatchFilterがFilterとして働きます。それぞれ、アクセスログを取得するフィルタ、文字コードを設定するフィルタ、例外処理をするフィルタです。javax.servlet.Filterを実装しているため、doFilterメソッドにそれぞれの処理が記述してあります。処理の最後に次のFilterを呼ぶために、FilterChainのdoFilterメソッドを呼びます。Filter自体の実装例はTECHSCORE
J2EE Servlet 6章. フィルタを参照してください。
- Target
- Targetはクライアントが要求したりソースです。
1.4 まとめ
Intercepting Filter パターンのまとめです。
- Webアプリケーションのなかで、各リソースにおいて共通するような処理を独立性の高いフィルタとして抜き出します。
- そうして作成したフィルタは、入力リクエストの前処理、出力レスポンスの後処理を行います。
- 各リソースへのフィルタは、設定ファイルを利用して追加・削除を設定します。
これにより、再利用性の向上、保守性の向上、フィルタの追加・削除が容易というようなメリットが得られます。