JAVA:IT TRICK

フィルタの基本

サーブレットの基本的な使い方について説明します。
  • このエントリーをはてなブックマークに追加
  • Clip to Evernote
  • IT TRICK RSS

サーブレットフィルタはサーブレットやJSPの共通処理を記述するための仕組みです。フィルタは任意のURLパターンを指定して、複数のリソース(サーブレット、JSP)に対して共通の処理を記述することができます。ここではサーブレットフィルタの設定の仕方や作り方について説明します。

サーブレットフィルタを利用するにはjavax.servlet.Filterインターフェースを実装したクラスを作成する必要があります。javax.servlet.Filterインターフェースには以下のメソッドを提供しています。必要がなくても実装する必要があります。

メソッド 説明
void init(FilterConfig filterConfig) throws ServletException 初期化時に一度だけ呼ばれる
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException フィルタ処理
void destroy() 終了時に一度だけ呼ばれる

javax.servlet.FilterConfigインタフェース

Fiterインタフェースのinit()メソッドの引数に指定されているインタフェースで、web.xmlに指定されたフィルタ初期化パラメータを取得する際に使用します。

javax.servlet.FilterChainインタフェース

FilterインタフェースのdoFilter()メソッドの引数に指定されているインタフェースです。フィルタは複数のフィルタを連続して呼び出すことができ、これを「フィルタチェーン」と呼びます。これを定義するのがFilterChainインタフェースです。このインタフェースには以下のメソッドが定義されており、このメソッドは必ずフィルタ内で呼び出すことになります。

メソッド 説明
void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException 連続するフィルタがある場合は、次のフィルタを呼び出す。現在のフィルタがチェーンの最後の場合、クライアントがアクセスしたリソースを呼び出す。

サーブレットフィルタのサンプル

このサンプルではすべてのリクエストのエンコードをUTF-8に設定しています。

Filter48134.java
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;

public class Filter48134 implements Filter {

	public void init(FilterConfig config) throws ServletException {
		System.out.println("init()");

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("doFilter()");

		request.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);

	}

	public void destroy() {
		System.out.println("destroy()");

	}

}

このサーブレットフィルタを利用するには以下のようにweb.xmlで定義する必要があります。フィルタの定義はまずfilter要素で、フィルタの名前をfilter-name要素とフィルタクラスをfilter-class要素に定義します。そしてfilter-mapping要素で、定義したフィルタの定期用urlを指定します。このサンプルでは「/*」と指定しているので、すべてのリクエストに対してフィルタが定期用されます。

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>

	<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>filter.Filter48134</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>