Servlet フィルターの開発と登録

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

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 のみ、あるいは全てのリクエストなど、 * をワイルドカードとして指定することができます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門