@634

Servlet

Advertisement

フィルタとは。

フィルタとはリクエストやリダイレクトに対してフィルタリングを行うメカニズムのこと。任意のサーブレットやJSPへのリクエストに対し、そのプログラムを実行する前にフィルタとして登録してあるクラスを実行することで、ロギング・認証などの仕組みをオリジナルのリソースを変更することなく、実現することが可能となる。

フィルタを後から追加する場合でも、すでにあるリソースやフィルタに変更を加えることなく追加することができる。

フィルタ実現の手順

フィルタの作成は以下の手順で行います。
  1. フィルタクラスを作成する。
  2. web.xml ファイルにフィルタを設定する。

フィルタクラスの作成

フィルタクラスを作成するには、javax.servlet.Filter インタフェースを実装する。Filter インタフェースには init(), doFilter(), destroy() という Servlet に良く似た3つのメソッドが用意されている。

各メソッドの役割も Servlet と同様で、
  • init():フィルタロード時の処理を記述
  • doFilter():フィルタクラス実行時の処理を記述
  • destroy():フィルタ破棄時の処理を記述
という役割になっている。

サンプル
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ConsoleFilter implements Filter{
    public void init(FilterConfig filterConfig) throws ServletException {

        System.out.println("Filter初期化");
    }

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

        System.out.println("Filter通過");

        try{
            // 次のフィルタに処理を送る
            chain.doFilter(request, response);
        }catch(ServletException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    public void destroy() {

        System.out.println("Filter破棄");
    }
}
次の処理にフィルタを送るメソッド chain.doFilter() を使用しているが、これは他のフィルタが存在する場合、そのフィルタに処理を送り、他のフィルタが存在しない場合には 実際のクラスへと処理を送るという動作を行う。

フィルタクラスのマッピング

フィルタクラスを作成したら、そのフィルタクラスを使用するために web.xml へ設定を行わなければならない。サーブレットにのマッピングと非常によく似ているため、理解しやすい。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.
  //DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <filter>
    <filter-name>consolefilter</filter-name>
    <filter-class>ConsoleFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>consolefilter</filter-name>
    <url-pattern>/sample</url-pattern>
  </filter-mapping>
</web-app>
filter-name:コンテナ上でのフィルタの別名
filter-class:フィルタの実際のクラス
filter-pattern:どのURLにフィルタを適用するか。ワイルドカード指定(*)も使用可能。

実行

実行結果 ※(括弧)内はプログラム以外の動作。
(サーブレットコンテナの起動)

(サーブレットへのアクセス http://localhost/Sample/sample )
Filter初期化
Filter通過

(サーブレットへのアクセス http://localhost/Sample/sample )
Filter通過

(サーブレットへのアクセス http://localhost/Sample/sample )
Filter通過

(サーブレットコンテナの停止)
Filter破棄
Servlet と同じく、init() メソッドは一番初めのクラスロード時にのみ行われている。

Advertisement

ショートカット

634
このカテゴリのトップページに戻る
634labs
   UIコレクションギャラリー

サイト検索

Google

Web サイト内

Y!ログール