Javaに関する様々な情報をご紹介します。

11フィルタのチェーン

Javaに関する様々な情報をご紹介します。

フィルタのチェーン

複数のフィルタを連続して実行することができます。このことをフィルタのチェーンといいます。ここでは、フィルタのチェーンの実行方法について解説します。

フィルタのチェーンの実行

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の順に実行されます。

11フィルタのチェーン