Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Servlet・JSP > Servlet −11.フィルタのチェーン
更新日:2006/10/28
Servlet−11.フィルタのチェーン
複数のフィルタを連続して実行することができます。このことをフィルタのチェーンといいます。ここでは、フィルタのチェーンの実行方法について解説します。
フィルタのチェーンの実行
FilterインタフェースのdoFilterメソッドは連続するフィルタが有る場合は次のフィルタを呼び出し(フィルタのチェーン)、連続するフィルタがない場合は元々要求されていたプログラムを呼び出します。 そのため、フィルタのチェーンを行うにあたり、プログラムに特別な処理を行う必要はありません。
web.xmlに連続して実行されるフィルタプログラムの条件を設定するだけで、フィルタのチェーンが行われます。
public class ExFilterServlet implements Filter {

  public void init(FilterConfig conf) throws ServletException {}

  public void doFilter(ServletRequest req, 
              ServletResponse res, FilterChain chain) 
              throws ServletException, IOException {
    -----------------------------
    -----------------------------
    //   連続するフィルタがある場合は、次のフィルタを呼び出します。
    //   連続するフィルタがない場合は、元々要求されていたプログラム
    //   を呼び出します。
    chain.doFilter(req, res);
  }

  public void destroy() {}
}
web.xmlの設定
フィルタの合致条件は、<filter-mapping>タグのサブ要素である<url-pattern>タグもしくは<servlet-name>タグで指定します。フィルタは<filter-mapping>タグの上から合致した順に実行されますが、<url-pattern>タグと<servlet-name>タグの両方に合致する場合は、<url-pattern>タグが優先されます。
【<url-pattern>タグのみを設定】
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <filter>
    <filter-name>AFilter</filter-name>
    <filter-class>AFilterServlet</filter-class>
  </filter>
  <filter>
    <filter-name>BFilter</filter-name>
    <filter-class>BFilterServlet</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>AFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>BFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  -------------------------------------------
  -------------------------------------------

</web-app>
【フィルタの実行例】
「http://localhost:8080/xxx/HelloServlet」でアクセス
(フィルタの実行順)
1. AFilter
2. BFilter
(解説)
フィルタは<filter-mapping>タグの上から合致した順に実行されます。そのため、AFilter、BFilterの順に実行されます。
【<url-pattern>タグのみを設定】
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <filter>
    <filter-name>AFilter</filter-name>
    <filter-class>AFilterServlet</filter-class>
  </filter>
  <filter>
    <filter-name>BFilter</filter-name>
    <filter-class>BFilterServlet</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>AFilter</filter-name>
    <servlet-name>HelloServlet</servlet-name>
  </filter-mapping>
  <filter-mapping>
    <filter-name>BFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  -------------------------------------------
  -------------------------------------------

</web-app>
【フィルタの実行例】
「http://localhost:8080/xxx/HelloServlet」でアクセス
(フィルタの実行順)
1. BFilter
2. AFilter
(解説)
<url-pattern>タグ、<servlet-name>タグの両方に合致する場合は、<url-pattern>タグが優先されます。そのため、フィルタはBFilter、AFilterの順に実行されます。



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道