サーブレット・フィルター
サーブレット・フィルターは、要求を変換したり、応答を変更したりすることができるフィルターと呼ばれる 新規タイプのオブジェクトを提供します。
指定されたリソースまたはリソースのグループの入出力を一群のフィルターが処理できるように、 いくつかのフィルターをチェーニングすることができます。
一般的なフィルターとしては、ロギング・フィルター、イメージ変換フィルター、暗号化フィルター、 および Multipurpose Internet Mail Extensions (MIME) タイプ・フィルター (機能的には、サーブレット・チェーニングと同等のもの) があります。 フィルターはサーブレットではありませんが、両者のライフサイクルは非常に似ています。
フィルターは、次のように処理されます。
- Web コンテナーは、
要求されたリソースに対する LoggingFilter を含む FilterChain を構成する必要があるかどうかを判別します。
FilterChain は、LoggingFilter の呼び出しから開始し、 要求されたリソースの呼び出しで終了します。
- ほかのフィルターがチェーンの中に入る必要がある場合は、 Web コンテナーは、それらのフィルターを theLoggingFilter より後ろで、かつ要求されたリソースより前に配置します。
- Web コンテナーは、次に LoggingFilter のインスタンス化と初期化を行い (前もって行われていない場合)、 doFilter(FilterConfig) メソッドを起動してチェーンを開始します。
- LoggingFilter は、要求オブジェクトと応答オブジェクトを前処理してから、
フィルター・チェーン doFilter(ServletRequest, ServletResponse) メソッドを起動します。
このメソッドは、処理をチェーン内の次のリソース、すなわち要求されたリソースに渡します。
- LoggingFilter は、 フィルター・チェーン doFilter(ServletRequest, ServletResponse) メソッドから戻ると、 要求オブジェクトと応答オブジェクトに後処理を実行してから、応答をクライアントに戻します。
Java™ Servlet 仕様 2.4 により、RequestDispatcher でフィルターを呼び出す代わりに、REQUEST、FORWARD、 INCLUDE、ERROR など、使用できる値を指定して、デプロイメント記述子に新規 <dispatcher> エレメントを定義できます。
Java Servlet 仕様 3.0 によって、RequestDispatcher でフィルターを呼び出す代わりに、REQUEST、FORWARD、INCLUDE、ERROR などの使用可能な値を指定して、デプロイメント記述子に新規 <dispatcher> エレメントを定義できます。
<filter-mapping>
<filter-name>Logging Filter</filter-name>
<url-pattern>/products/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
これは、要求の転送同様、フィルターがクライアントから直接要求に適用される必要があることを示しています。 また、INCLUDE および ERROR 値の追加は、フィルターがインクルードされた 要求および <error-page> 要求にも適用される必要があることを 示します。<dispatcher> エレメントを指定しない場合、デフォルトは REQUEST です。
サーブレット・フィルター用の Filter、FilterChain、FilterConfig クラス
以下のインターフェースは、javax.servlet パッケージの一部として定義されます。
- Filter インターフェース - メソッド: doFilter、getFilterConfig、setFilterConfig
- FilterChain インターフェース - メソッド: doFilter
- FilterConfig インターフェース - メソッド: getFilterName、getInitParameter、getInitParameterNames、 getServletContext
以下のクラスは、javax.servlet.http パッケージの一部として定義されます。
- HttpServletRequestWrapper - メソッド: 「Servlet 2.4 Specification」を参照。
- HttpServletResponseWrapper - メソッド: 「Servlet 2.4 Specification」を参照。