Servlet フィルターの開発と登録
ここでは Servlet に対するフィルター・プログラムを開発するための基本について説明します。 Servlet フィルター は、JSP や Servlet を処理する前後に組み込んで使い、JSP や Servlet の動作をカスタマイズするために利用できます。
Servlet フィルターの開発方法
フィルターは次のような手順で作成します。
- javax.servlet.Filter インターフェイスを実装したクラスを作ります。
- フィルターで行いたいことを doFilter メソッドで実装します。
- FilterChain オブジェクトの doFilter メソッドを呼出します。
- デプロイメント・デスクリプタにフィルターを登録します。
それぞれの手順をみてみましょう。
まず 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 のみ、あるいは全てのリクエストなど、 * をワイルドカードとして指定することができます。