フレサーモン難民

備忘録など ほぼ自分向けのまとめ

フィルタ

フィルタとは

サーブレットに用意された特別なクラス。文字コードの設定など、同じ処理が複数のサーブレットクラスがある場合、その処理をフィルタにまとめることができる。

フィルタのメソッドに記述された処理は、サーブレットクラスのdoGet()およびdoPost()メソッドが実行される前後のタイミングで自動的に実行される。なので、フィルタを複数のサーブレットクラスに設定することで、それらのサーブレットクラスで共通する処理をまとめることができる。

また、ひとつのサーブレットクラスに複数のフィルタを設定し連続で実行することもできる(フィルタチェーン)。

フィルタの例

package filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("/*")
public class FilterSample implements Filter {
  public void init(FilterConfig fConfig) throws ServletException { }
  public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
      request.setCharacterEncoding("UTF-8");
      chain.doFilter(request, response);
    }
    public void destroy() { }
  }
}

WebFilterアノテーション

WebFilterアノテーションで、フィルタを設定するサーブレットクラスを指定する。すべてのサーブレットクラスにそのフィルタを指定する場合は

@WebFilter("/*");

となる。

Filterインタフェースの実装

フィルタはjavax.servlet.Filterインタフェースを実装して作成する。このインタフェースには、フィルタがインスタンス化された直後に実行されるinit()、フィルタのインスタンスが廃棄される直前に実行されるdestroy()、そして設定されたサーブレットクラスがリクエストされたときに実行されるdoFilter()の3つのメソッドが定義されていて、フィルタを作成する際はこれらを全て実装しないといけない。

doFilter()メソッド

doFilter()メソッド内の

chain.doFilter(request, response);

より前の部分に記述した処理は前処理、後の部分に記述した処理は後処理になる(サーブレットクラスのdoGet()/doPost()メソッドが実行される前か後か?)

文字コードの設定は前処理になる。

参照:「スッキリわかるサーブレットJSP入門 第2版」