フィルタ機能を利用するには、“フィルタクラス”と“フィルタクラスを適用する対象”を定義します。ここでは、フィルタクラスを適用する対象の定義について説明します。
フィルタクラスを適用する対象は、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); } } }