サーブレットおよび JSP のフィルターは Java クラスであり、その存在目的は次のとおりです。
バックエンドリソースへのアクセスをリクエストするときにインターセプトする
サーバーからクライアントに返される応答を管理する
一般的なフィルターの種類をいくつか以下に示します。
認証フィルター
データ圧縮フィルタ
暗号化フィルター
リソースアクセスイベントをトリガーするフィルター
画像変換フィルター
ログインおよび認証フィルター
MIME タイプ チェーン フィルター
トークンフィルター
XML コンテンツを変換するための XSL/T フィルター
フィルタは web.xml ファイルに挿入され、サーブレット、JSP ファイル、または URL パターンの名前にマップされます。デプロイメント記述ファイル web.xml は、<Tomcat インストール ディレクトリ>conf ディレクトリにあります。
JSP コンテナは、Web アプリケーションを開始するときに、各フィルタのインスタンスを作成します。これらのフィルタは、デプロイメント記述子ファイル web.xml で宣言し、宣言された順序で実行する必要があります。
フィルターは、javax.servlet.Filter インターフェースを実装する Java クラスです。 javax.servlet.Filter インターフェースは 3 つのメソッドを定義します。
シリアルナンバー | 方法と説明 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain)クライアントはチェーンの最後でリソースを要求するため、リクエスト/レスポンスがフィルター チェーンを通過するたびにコンテナはこのメソッドを呼び出します。 |
2 | public void init(FilterConfig filterConfig)コンテナはこのメソッドを呼び出して、サービスにフィルタが配置されていることを示します。 |
3 | public void destroy()このメソッドは、フィルタがサービスから削除されていることを示すためにコンテナによって呼び出されます。 |
この例では、JSP ファイルへの各アクセスの IP アドレスと日時が出力されます。もちろん、これは単純なフィルターの使用方法を説明するための単純な例にすぎませんが、これらの概念を使用して、より複雑なプログラムを自分で構築することができます。
//Java パッケージを導入します import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.* //Filter クラスを実装します public class LogFilterimplements Filter { public void init( FilterConfig config) throws ServletException{ // 初期化パラメータを取得 String testParam = config.getInitParameter("test-param"); //初期化パラメータを出力します System.out.println("Test Param: " + testParam); } public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws java.io.IOException, ServletException { // クライアントの IP アドレスを取得しますString ipAddress = request.getRemoteAddr(); // IP アドレスと現在時刻を出力 System.out.println("IP "+ ipAddress + ", Time " + new Date().toString()); // リクエスト フィルター チェーンを渡す chain.doFilter(request,response) } public void destroy( ){ /* フィルター インスタンスが破棄された後サーバー 削除前に呼び出されます。 */ }}
LogFilter.java ファイルをコンパイルし、コンパイルしたクラス ファイルを <Tomcat インストール ディレクトリ>/webapps/ROOT/WEB-INF/classes ディレクトリに配置します。
フィルタは、サーブレットの定義とマッピングと同様に、定義され、URL または JSP ファイル名にマッピングされます。デプロイメント記述ファイル web.xml で、フィルター マッピングに <filter> タグを使用します。
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >初期化パラメータ</param-value> </init-param></filter><filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
設定で「/*」を指定したため、上記のフィルターはすべてのサーブレットと JSP プログラムに適用されます。少数のサーブレットまたは JSP プログラムにのみフィルターを適用する場合は、サーブレットまたは JSP パスを指定することもできます。
ここで、通常どおりサーブレットまたは JSP ページにアクセスすると、このアクセスの記録がサーバー ログに記録されます。 Log4J ロガーを使用して他のファイルにログを記録することもできます。
Web アプリケーションでは、さまざまなフィルターを定義できます。これで、AuthenFilter と LogFilter という 2 つのフィルターが定義されました。次のような別のマッピングを作成することを除いて、他の手順は前と同じです。
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >初期化パラメータ</param-value> </init-param></filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>初期化パラメータ</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
web.xml 内の <filter> 要素のマッピング順序によって、コンテナがこれらのフィルターを適用する順序が決まります。アプリケーションの順序を逆にするには、web.xml で <filter> 要素が定義されている順序を逆にするだけです。
たとえば、上記の例では最初に LogFilter を適用し、次に AuthenFilter を適用しますが、次の例では適用順序が逆になります。
<filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>LogFilter</filter -name> <url-pattern>/*</url-pattern></filter-mapping>