サーブレットフィルタの実装と設定

フィルタの概要

フィルタはサーブレット技術における重要なコンポーネントであり、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>

タグ: Java Servlet filter Web.xml ChainFilter

5月26日 15:33 投稿