Java 入門

ホーム > Web アプリケーションの開発 > JSP/サーブレット・フィルターの基本

JSP/サーブレット・フィルターの基本

ここでは JSP/Servlet に対するフィルター・プログラムを開発するための基本について説明します。 フィルター (Filter) は、JSP や Servlet を処理する前後に組み込んで使い、JSP や Servlet の動作をカスタマイズするために利用できます。

フィルターの開発方法

フィルターは次のような手順で作成します。

  1. javax.servlet.Filter インターフェイスを実装したクラスを作ります。
  2. フィルターで行いたいことを doFilter メソッドで実装します。
  3. FilterChain オブジェクトの doFilter メソッドを呼出します。
  4. デプロイメント・デスクリプタにフィルターを登録します。

それぞれの手順をみてみましょう。

まず javax.servlet.Filter インターフェイスを実装したクラスを作ります

Filter インターフェイスは init メソッド、destroy メソッド、doFilter メソッドを持っているので、基本的な雛形は次のような形になります。

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;

public class TestFilter implements Filter {

  @Override
  public void destroy() {
  
  }
  
  @Override
  public void doFilter(
    ServletRequest req,
    ServletResponse resp,
    FilterChain filterChain
    throws IOException, ServletException {
  
    filterChain.doFilter(req, resp);
  }
  
  @Override
  public void init(FilterConfig filterConfig
  throws ServletException {
  
  }

}

doFilter メソッド内で filterChain.doFilter を呼出していますが、これについては後述します。

init メソッド、destroy メソッドは、フィルターオブジェクトのロード、アンロード時にそれぞれ一度だけ呼び出されます。 何らかのリソースをフィルター内部で保持する場合は、init メソッド、destroy メソッドで取得、解放を行うと良いです。

doFilter メソッドは、まさにフィルター処理を行う場所で、必要に応じて何度も呼出されます。 doFilter の第一パラメータはそれぞれ ServletRequest タイプですが、 HTTP のハイレベルな情報にアクセスするには、これを HttpServletRequest にキャストすれば OK です。 これで通常のサーブレットの doGet や doPost などで取得できるパラメータと同様に扱えます。

FilterChain の doFilter の呼出し

フィルタは複数登録できます。複数のフィルタがある場合 Filter1 → Filter2 → Filter3 ... という風に順番に呼出されますが、 行儀良く次のフィルターを呼出す責任はそれぞれのフィルターにあります。 こうすることによって、フィルターのチェーンを途中で断ち切るようなフィルターを書くこともできるようなり開発の自由度が高まります。

例えば、認証を行うフィルターを開発するなら、認証が成功すればフィルター・チェーン内の次のフィルターを呼出し、 認証が失敗した場合は、フィルター・チェーンを断ち切り、ログインページへリダイレクトする処理を行うこともできます。

フィルターのデプロイメント・デスクリプタ web.xml への登録

フィルタを有効にするには、web.xml にフィルタクラスを登録します。

<filter>
  <filter-name>TestFilter</filter-name>
  <filter-class>com.keicode.java.test.TestFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>TestFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

filter-name/filter-class のペアについては、通常のサーブレットクラスの登録と同様です。 filter-mapping の設定ではどのリクエストに対してフィルターを有効にするか url-pattern で指定します。 特定のディレクトリ以下、特定の JSP のみ、あるいは全てのリクエストなど、 * をワイルドカードとして指定することができます。

ホーム > Web アプリケーションの開発 > JSP/サーブレット・フィルターの基本