フィルタ機能を利用するには、“フィルタクラス”と“フィルタクラスを適用する対象”を定義します。ここでは、フィルタクラスを適用する対象の定義について説明します。
フィルタクラスを適用する対象は、filter-mappingタグで定義します。
filter-mappingタグでは、リクエストに対して、どのフィルタをどの順番で使えばよいかをかWebコンテナに指示します。
filter-mappingタグは複数定義することができます。フィルタを実行する順番は、以下のように決まります。
<url-pattern>要素が定義されている<filter-mapping>の設定が有効になります。
web.xmlに<url-pattern>要素が定義されている<filter-mapping>の設定が複数存在する場合には、定義されている順番でフィルタを実行する順番が決まります。
<servlet-name>要素が定義されている<filter-mapping>の設定が有効になります。
web.xmlに<servlet-name>要素が定義されている<filter-mapping>の設定が複数存在する場合には、定義されている順番でフィルタを実行する順番が決まります。
記述形式
<filter-mapping>
<filter-name>value</filter-name>
<servlet-name>name</servlet-name>
<dispatcher>value</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>value</filter-name>
<url-pattern>pattern</url-pattern>
<dispatcher>value</dispatcher>
</filter-mapping>タグの内容
タグ名 | 説明 | タグの省略 | 複数の指定 |
|---|---|---|---|
filter-name | 一意であるフィルタ名を指定します。 | × | × |
url-pattern | フィルタとマッピングするURLパターンを指定します。
| × | × |
servlet-name | フィルタとマッピングするサーブレット名を指定します。 | × | × |
dispatcher | フィルタの呼出しのタイミングを指定します。 以下の値を指定します。
| ○ | ○ |
記述例
特定のサーブレットに対するフィルタの定義を以下に示します。
<filter>
<filter-name>helloWorld</filter-name> ← フィルタクラスの別名です。
<filter-class>MyHelloWorldFilter</filter-class> ← フィルタクラス名です。
<init-param>
<param-name>company</param-name>
<param-value>Fujitsu Ltd.</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>helloWorld</filter-name> ← フィルタクラスの別名です。
<servlet-name>MyHelloWorld</servlet-name> ← サーブレット名です。
</filter-mapping>単独のURL(以下の例ではJSPファイルのURL)に対するフィルタの定義を以下に示します。
<filter>
<filter-name>helloWorld</filter-name> ← フィルタクラスの別名です。
<filter-class>MyHelloWorldFilter</filter-class> ← フィルタクラス名です。
<init-param>
<param-name>company</param-name>
<param-value>Fujitsu Ltd.</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>helloWorld</filter-name> ← フィルタクラスの別名です。
<url-pattern>/filter.jsp</url-pattern>
← フィルタとマッピングするURIパターンです。
</filter-mapping>URIパターンに対するフィルタの定義を以下に示します。
以下の例では、ワイルドカードを使って“/jsp/”以下のリソースのすべてがフィルタ機能の対象になることを示しています。
<filter>
<filter-name>helloWorld</filter-name> ← フィルタクラスの別名です。
<filter-class>MyHelloWorldFilter</filter-class> ← フィルタクラス名です。
<init-param>
<param-name>company</param-name>
<param-value>Fujitsu Ltd.</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>helloWorld</filter-name> ← フィルタクラスの別名です。
<url-pattern>/jsp/*</url-pattern> ← フィルタとマッピングするURIパターンです。
</filter-mapping>Webアプリケーションの記述例
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class MyHelloWorldFilter implements Filter {
String company;
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain)
throws IOException, ServletException {
HttpServletResponseWrapper wrapper = new MyResponseWrapper(
(HttpServletResponse)res);
chain.doFilter(req, wrapper);
CharArrayWriter writer = new CharArrayWriter();
writer.write(wrapper.toString().substring(0,
wrapper.toString().indexOf("</body>")-1));
writer.write("<hr>\n");
writer.write("Copyrights © " + company + "\n");
writer.write("</body>\n</html>\n");
PrintWriter out = res.getWriter();
res.setContentLength(writer.toString().length());
out.write(writer.toString());
out.close();
}
public void init(FilterConfig config) throws ServletException {
company = config.getInitParameter("company");
}
public void destroy(){}
class MyResponseWrapper extends HttpServletResponseWrapper {
private CharArrayWriter output;
public String toString() {
return output.toString();
}
public MyResponseWrapper(HttpServletResponse response){
super(response);
output = new CharArrayWriter();
}
public PrintWriter getWriter(){
return new PrintWriter(output);
}
}
}