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

10フィルタ

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

フィルタ

フィルタとはクライアントとサーバ間のリクエスト・レスポンス時に何らかの処理を行う機能です。ログの生成、パラメータ値の変更、フォーマット変更、認証などの処理を行います。ここでは、Servletでのフィルタの使用方法について解説します。

フィルタ関連のインタフェース・クラス

Servletで用意されているフィルタ関連のインタフェース・クラスについて解説します。

javax.servlet.Filterインタフェース

フィルタを使用するServletプログラムが直接的・間接的に必ず実装していなければいけないインタフェースです。Filterインタフェースには以下の3つのメソッドが定義されています。

戻り型 メソッド 説明
void init(
FilterConfig)
フィルタプログラムに初めてアクセスが合った時に、一度だけ呼び出されるメソッドです。フィルタプログラムの初期化処理を行います。
void doFilter(
ServletRequest, ServletResponse, FilterChain)
フィルタ処理が行われるリクエストがあるたびに呼び出されるメソッドです。このメソッドで実行したいフィルタ処理を行います。
void destroy( ) コンテナの終了などフィルタプログラムが破棄されるときに呼び出されるメソッドです。リソースの開放など終了処理を行います。
javax.servlet.FilterConfigインタフェース

Filterインタフェースのinitメソッドの引数に指定されているインタフェースです。web.xmlに指定されたフィルタ関連の初期化パラメータを取得する際に使用します。FilterConfigインタフェースには以下の4つのメソッドが定義されています。

戻り型 メソッド 説明
String getFilterName( ) web.xmlに指定されているフィルタ名を返します。
String getInitParam
eter(String)
引数にパラメータ名を指定し、該当するパラメータ値を返します。フィルタのパラメータはweb.xmlに指定します。パラメータ名が存在しない場合はNullが返されます。
Enumeration getInitParam
eterNames( )
web.xmlに指定されているフィルタの初期化パラメータ名を返します。パラメータが存在しない場合はNullが返されます。
Servlet
Context
getServlet
Context( )
実行されているServletContextオブジェクトを返します。
javax.servlet.FilterChainインタフェース

FilterインタフェースのdoFilterメソッドの引数に指定されているインタフェースです。フィルタは複数のフィルタを連続して呼び出すこと(チェーン)ができます。FilterChainインタフェースはその際に使用します。FilterChainインタフェースには以下のメソッドが定義されています。

戻り型 メソッド 説明
void doFilter(
Servlet
Request,
Servlet
Response)
連続するフィルタがある場合は、次のフィルタを呼び出します。連続するフィルタがない場合(チェーンの最後のフィルタ)は、元々要求されていたプログラムを呼び出します。

web.xmlの設定

フィルタを使用する際は、フィルタプログラムをweb.xmlに指定する必要があります。フィルタプログラムの指定は、<filter>タグ及び、<filter-mapping>タグで行います。

<filter>タグには、作成したフィルタプログラムを指定します。
<filter-mapping>タグにはフィルタ処理を適用する条件をURLパターン、もしくはServlet名で指定します。

<filter>タグのサブ要素

要素 内容 要素数
description フィルタの説明を記載します。 0以上
display-name GUIツールで表示されるフィルタの名前を記載します。 0以上
icon GUIツールで表示される画像を指定します。 0以上
filter-name フィルタプログラムの名前を指定します。 1
filter-class 作成したフィルタプログラムを指定します。パッケージに含まれる場合は、パッケージ名から指定します。 1
init-param FilterConfigインタフェースで取得できるフィルタ処理時の初期化パラメータを指定します。 0以上
description <init-param>タグのサブ要素です。<init-param>タグの説明を記載します。 0以上
param-name <init-param>タグのサブ要素です。パラメータ名を指定します。 1
param-value <init-param>タグのサブ要素です。パラメータ名に対応するパラメータ値を指定します。 1

<filter-mapping>タグのサブ要素

要素 内容 要素数
filter-name <filter>タグで指定した"filter-name"の値を指定します。 1
url-pattern "url-pattern"か"servlet-name"のいずれかを指定します。"url-pattern"を指定した場合は、該当するURLでアクセスがあった場合にフィルタ処理が適用されます。"url-pattern"は?、*のワイルドカードを使用することができます。 1
servlet-name "url-pattern"か"servlet-name"のいずれかを指定します。"servlet-name"にはタグで指定した"servlet-name"の値を指定します。該当するServletプログラムにアクセスがあった場合にフィルタ処理が適用されます。 1
dispatcher FORWARD、INCLUDE、REQUEST、ERRORのいずれかを指定します。FORWARDを指定した場合は、RequestDispatcher.forward( )の処理のときのみにフィルタが適用されます。INCLUDEを指定した場合は、RequestDispatcher.include( )の処理のときのみにフィルタが適用されます。REQUESTを指定した場合は、通常のクライアントからのアクセスのときのみにフィルタが適用されます。ERRORを指定した場合は例外処理のときのみにフィルタが適用されます。何も指定しない場合はREQUESTが適用されます。 0か1

使用例

フィルタの使用例について解説します。アクセスがあった際にアクセスされたURLをログとして生成する処理をフィルタ処理で行います。

【ExFilterServlet.java】ログを生成するフィルタ処理のプログラムです。

package pack;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

//(1)Filterインタフェースを実装します。
public class ExFilterServlet implements Filter {

    public void init(FilterConfig conf) throws ServletException {}

        //(2)doFilterメソッドにフィルタ処理を記載します。
        public void doFilter(ServletRequest req,
                ServletResponse res, FilterChain chain)
                throws ServletException, IOException {

        //(3)getRequestURLメソッドでアクセスがあったURLを表示します。
        System.out.println(((HttpServletRequest) req).getRequestURL() +
            ":" + new java.util.Date());

        //(4)doFilterメソッドで、連続するフィルタがある場合は、次のフィルタを呼び出します。連続するフィルタがない場合は、元々要求されていたプログラムを呼び出します。
        //   この例ではHelloServletを呼び出します。
        chain.doFilter(req, res);

    }

    public void destroy() {}
}

【HelloServlet.java】仮にアクセスされるプログラムです。単にブラウザに"Hello World!"と表示します。

package pack;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends javax.servlet.http.HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
    
        PrintWriter out = res.getWriter();
        out.println("<HTML>");
        out.println("<BODY>");
        out.println("<H3>Hello World!</H3>");
        out.println("</BODY>");
        out.println("</HTML>");
    }
}

【web.xml】フィルタプログラムとフィルタ処理が適用されるマッピング条件を指定します。

<?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">

    <!-- (1)フィルタプログラムを指定しています。 -->
    <filter>
        <filter-name>ExFilterServlet</filter-name>
        <filter-class>pack.ExFilterServlet</filter-class>
    </filter>
    <!-- (2)フィルタ処理を適用する条件を指定します。
            /*と指定しており、すべてのアクセスにフィルタ処理が適用されます。-->
    <filter-mapping>
        <filter-name>ExFilterServlet</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>pack.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/Hello</url-pattern>
    </servlet-mapping>

</web-app>

【実行結果】フィルタプログラムは通常のServletプログラムと同様にコンテキストルート\WEB-INF\classesディレクトリ配下に配置します。Servletプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。

URL:http://localhost:8080/TEST/Hello
Javaの道_フィルタ
・・・・・・・・・・
・・・・・・・・・・
情報: Find registry server-registry.xml at classpath resource
2006/10/23 23:13:26 org.apache.catalina.startup.Catalina start
情報: Server startup in 3095 ms

# アクセスしたURLを記したログが生成されているのが確認できます。
http://localhost:8080/TEST/Hello:Mon Oct 23 23:13:32 JST 2006

10フィルタ