フィルタ


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

<filter>要素と<filter-mapping>要素

例として「/hello/」で始まるURLでサーブレットが呼ばれた場合に適用するフィルタを作成する場合
<web-app>
  <filter>
    <filter-name>
      filtertest      // ←フィルタ名
    </filter-name>
    <filter-class>
      FilterTest      // ←フィルタとして実行するサーブレットクラス名
    </filter-class>
  </filter>

  <filter-mapping>
    <filter-name>
      filtertest      // ←フィルタ名
    </filter-name>
    <url-pattern>
      /hello/*        // ←URLパターン
    </url-pattern>
  </filter-mapping>
</web-app>
フィルタを使う場合でも、もちろん<servlet>要素や<servlet-mapping>要素を記述する必要がある。
フィルタの記述する位置は<servlet>要素よりも前に記述する。

Filterインターフェース

"init"メソッド、"destroy"メソッド、"doFilter"メソッドを実装する。
import java.io.*;
import javax.servlet.*;
import javax.servlet.Filter;
import javax.servlet.FilterChain;

public class FilterTest implements Filter{

    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain){

        try{
            /* フィルタで行う処理 */
        }catch (ServletException se){
        }catch (IOException e){
        }
    }

    public void init(FilterConfig filterConfig){
    }

    public void destroy(){
    }
}
次のサーブレットへ処理を移すには、FilterChainインターフェースで定義されている"doFilter"メソッドを使用する。
public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain){

    try{
        /* フィルタで行う処理 */
        chain.doFilter(request, response);
    }catch (ServletException se){
    }catch (IOException e){
    }
}
FilterChainインターフェースの"doFilter"メソッドを呼び出さずに、他のサーブレットへフォワードやリダイレクトしてフィルタの流れを切る事も可能。
if (認証が行われている) then{
    chain.doFilter(request, response);
}else{
    ((HttpServletResponse)response).sendRedirect("/Login");
}
URL http://localhost:8080/filter/helloworld
アプリケーション配置場所 c:\servlet-sample\filter\
web.xmlファイル c:\servlet-sample\filter\WEB-INF\web.xml
コンテキストファイル C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\filter.xml

フィルタを多重に設定する

<filter>要素と<filter-mapping>要素を複数記述すればよい。
フィルタの実行順は、<filter-mapping>が定義されている順となる。
<web-app>

  <filter>
    <filter-name>filtertest</filter-name>
    <filter-class>FilterTest</filter-class>
  </filter>

  <filter>
    <filter-name>filtertest2</filter-name>
    <filter-class>FilterTest2</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>filtertest</filter-name>      // ←最初に実行されるフィルタ
    <url-pattern>/hello/*</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>filtertest2</filter-name>     // ←後に実行されるフィルタ
    <url-pattern>/hello/*</url-pattern>
  </filter-mapping>

</web-app>

<dispatcher>要素

サーブレットから別のサーブレットへフォワードされた時にフィルタが呼び出されるように設定することも可能。
<filter-mapping>要素の子要素の1つに<dispatcher>要素があり、<dispatcher>要素にどのタイミングでフィルタが実行されるのかを指定する。
フィルタのタイミング
REQUEST URLがリクエストされた時
FORWARD フォワードが行われた時
INCLUDE インクルードが行われた時
ERROR エラーページへ処理が移る時
1つの<filter-mapping>要素内で<dispatcher>要素は0回から4回まで設定出来、4つの全てのタイミングを指定することも可能。
<web-app>

  <filter>
    <filter-name>filtertest</filter-name>
    <filter-class>FilterTest</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>filtertest</filter-name>
    <url-pattern>/hello/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

</web-app>