Servlet Filter


Filterとは?

  • フィルタは、シーケンスボードの前後の任意の動作を実行するために使用される.たとえば、クライアントが送信したデータを復号化したり、サーバの実行前に必要なリソースをプリセットしたり、サーバが実行されるたびにログを残すなどの操作をフィルタで処理できます.

  • Filterの例
    public class CharacterEncodingFilter implements Filter {
    	FilterConfig config;
        
        @Override
        public void init(FilterConfig filterConfig) throws ServletException{
        	this.config = filterConfig;
        }
        
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        	servletRequest.setCharacterEncoding(config.getInitParameter("encoding"));
            filterChain.doFilter(servletRequest, servletResponse);
        }
        
        @Override
        public void destroy(){}
        
    }
    

  • init()
    Init()メソッドでは、フィルタオブジェクトが作成され、準備作業のために一度だけ呼び出されます.サーブレットのinit()と同じ用途です.パラメータはFilterConfigの例です.この例では、フィルタ初期化パラメータの値を取り出すことができます.上記のコードは、doFilter()で使用するためにインスタンス変数configに格納されます.

  • doFilter()
    フィルタとマッピングされたURLへのアクセスを要求するたびにdoFilter()が呼び出されます.このメソッドでは、フィルタが実行するタスクが作成されます.
    filterChain次のフィルタfilterChainを指すdoFilter()は、次のフィルタを呼び出します.次のフィルタがない場合は、サーブレットのサービス()が内部から呼び出されます.
  • サーブレットを実行する前に、処理するタスクはFilterChainです.DoFilter()の前に、Sebritを実行した後に処理するタスクはFilterChainです.doFilter()の後に作成します.
  • destroy()
    Webアプリケーションを閉じる前に、サーブレットコンテナはdestory()を呼び出してフィルタを終了します.
  • フィルタの駆動プロセス

  • サーブレットコンテナWebアプリケーションを起動すると、DDファイル(web.xml)に登録されたフィルタインスタンスが作成され、init()が呼び出されます.
  • クライアント要求を受信すると、対応するフィルタのdoFilter()が呼び出されます.
  • doFilter()でタスクを実行し、次のフィルタのdoFilter()を呼び出します.
  • の最後のフィルタまで3回繰り返します.
  • 最後のフィルタはサーブレットのサービス()を呼び出す.
  • サーバのサービス()が終了すると、サービス()を呼び出す古いフィルタが返されます.
  • を繰り返し、最初に呼び出されたフィルタに戻ります.
  • は、最後に応答結果をクライアントに送信する.
  • 配置フィルタ(Deployment)


    フィルタの配置方法はwebです.xmlには設定方法があり、コメントには設定方法があります.
    web.xmlでレイアウト情報を設定する
    <!-- 필터 선언 -->
    <filter>
    	<filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.test.CharacterEncodingFilter</filter-class>
        <init-param>
        	<param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    
    <!-- 필터 URL 매핑 -->
    <filter-mapping>
    	<filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    :フィルタ別名の設定
    :パッケージ名を含むフィルタ・クラスの作成
    :フィルタで使用する静的データの設定
    :フィルタを使用するURLのマッピング
    :フィルタ別名の指定
    :フィルタを適用するURLを指定します./*指定すると、すべてのリクエストにフィルタが適用されます.

    位置決め情報の設定


    @WebFilter(
    urlPatterns = "/*",
    initParams = {
    @WebInitParam(name="encoding", value = "UTF-8")
    }
    )
    以下に示すように、フィルタクラスに@WebFilterアクションを追加します.
    urlPatternsで指定した値は親と同じである必要があります.

    フィルタの例


    前処理(サーブレットの実行前)
    実行後タスク(起動後)
    文字セットの設定
    解凍
    圧縮応答データ
    暗号化データの復号化
    レスポンスデータ暗号化
    ログの作成
    ユーザーの検証
    ユーザー権限の検証