フィルタの概要
フィルタはサーブレット技術における重要なコンポーネントであり、JSPやサーブレット、静的リソースへのリクエストをインターセプトします。主な用途として、アクセス制御、コンテンツフィルタリング、レスポンス圧縮などが挙げられます。Filterインターフェースを実装することで、リクエスト処理前後の動作を制御できます。
インターセプトの仕組み
doFilterメソッドが処理の中心となり、以下の機能を実現します:
- ターゲットリソース実行前の処理
- リソース実行の制御(許可/拒否)
- ターゲットリソース実行後の処理
FilterChainオブジェクトのdoFilterメソッドを呼び出すことで、処理フローを次へ進めます。
実装手順
基本実装例
package com.example.filter;
import javax.servlet.*;
import java.io.IOException;
public class BasicFilter implements Filter {
@Override
public void init(FilterConfig config) {
System.out.println("フィルタ初期化");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
res.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
System.out.println("前処理");
chain.doFilter(req, res);
System.out.println("後処理");
}
@Override
public void destroy() {
System.out.println("フィルタ破棄");
}
}
設定ファイル例 (web.xml)
<filter>
<filter-name>BasicFilter</filter-name>
<filter-class>com.example.filter.BasicFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>BasicFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
フィルタ連鎖
複数のフィルタを連鎖的に適用できます。設定順序に従い、各フィルタが順次実行されます。FilterChain.doFilter()の呼び出しにより、次のフィルタへ処理が引き継がれます。
ライフサイクル管理
- 初期化: アプリ起動時にinit()が1度実行
- 破棄: destroy()でリソース解放
設定パラメータの活用
public class ConfigFilter implements Filter {
@Override
public void init(FilterConfig config) {
String paramValue = config.getInitParameter("paramName");
System.out.println("初期パラメータ: " + paramValue);
}
// doFilterメソッドは省略
}
設定例
<filter>
<filter-name>ConfigFilter</filter-name>
<filter-class>com.example.filter.ConfigFilter</filter-class>
<init-param>
<param-name>paramName</param-name>
<param-value>exampleValue</param-value>
</init-param>
</filter>
高度な設定
ディスパッチタイプの指定により、フィルタ適用範囲を制御できます:
<filter-mapping>
<filter-name>AdvancedFilter</filter-name>
<url-pattern>/secure/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>