Jsp-writing-filters

提供:Dev Guides
移動先:案内検索

JSP-フィルター

この章では、JSPのフィルターについて説明します。 サーブレットとJSPフィルターは、次の目的のためにサーブレットとJSPプログラミングで使用できるJavaクラスです-

  • バックエンドでリソースにアクセスする前にクライアントからのリクエストをインターセプトする。
  • クライアントに返される前にサーバーからの応答を操作するため。

仕様で提案されているフィルターのさまざまな種類があります-

  • 認証フィルター
  • データ圧縮フィルター
  • 暗号化フィルター
  • リソースアクセスイベントをトリガーするフィルター
  • 画像変換フィルター
  • ロギングおよび監査フィルター
  • MIME-TYPEチェーンフィルター
  • トークン化フィルター
  • XMLコンテンツを変換するXSL/Tフィルター

フィルターはデプロイメント記述子ファイル web.xml にデプロイされ、アプリケーションのデプロイメント記述子のサーブレット名またはJSP名またはURLパターンにマップされます。 デプロイメント記述子ファイルweb.xmlは、_ <Tomcat-installation-directory> \ conf_ディレクトリにあります。

JSPコンテナがWebアプリケーションを起動すると、デプロイメント記述子で宣言した各フィルターのインスタンスが作成されます。 フィルターは、デプロイメント記述子で宣言されている順序で実行されます。

サーブレットフィルターメソッド

フィルターは、単に javax.servlet.Filter インターフェースを実装するJavaクラスです。 javax.servlet.Filterインターフェイスは3つのメソッドを定義します-

S.No. Method & Description
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

このメソッドは、チェーンの最後にあるリソースに対するクライアントリクエストのために、リクエスト/レスポンスペアがチェーンを通過するたびにコンテナによって呼び出されます。

2

public void init(FilterConfig filterConfig)

このメソッドは、サービスに配置されていることをフィルターに示すために、Webコンテナーによって呼び出されます。

3

public void destroy()

このメソッドは、Webコンテナによって呼び出され、サービスが停止されていることをフィルターに示します。

JSPフィルターの例

次の例は、JSPファイルにアクセスするたびに、クライアントのIPアドレスと現在の日時を印刷する方法を示しています。 この例では、JSPフィルターの基本的な理解が得られますが、同じ概念を使用してより高度なフィルターアプリケーションを作成できます-

//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

//Implements Filter class
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) throws ServletException {
     //Get init parameter
      String testParam = config.getInitParameter("test-param");

     //Print the init parameter
      System.out.println("Test Param: " + testParam);
   }
   public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws java.io.IOException, ServletException {

     //Get the IP address of client machine.
      String ipAddress = request.getRemoteAddr();

     //Log the IP address and current timestamp.
      System.out.println("IP "+ ipAddress + ", Time "+ new Date().toString());

     //Pass request back down the filter chain
      chain.doFilter(request,response);
   }
   public void destroy( ) {
     /* Called before the Filter instance is removed
      from service by the web container*/
   }
}

通常の方法で LogFilter.java をコンパイルし、 LogFilter.class ファイルを <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes に配置します。

Web.xmlでのJSPフィルターマッピング

サーブレットを定義してから web.xml ファイルのURLパターンにマップするのとほぼ同じ方法で、フィルターを定義してからURLまたはJSPファイル名にマップします。 デプロイメント記述子ファイル web.xml にフィルタータグの次のエントリを作成します

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>

   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

上記のフィルターは、構成で / *を指定したため、すべてのサーブレットとJSPに適用されます。 一部のサーブレットまたはJSPのみにフィルターを適用する場合は、特定のサーブレットまたはJSPパスを指定できます。

ここで、サーブレットまたはJSPを呼び出そうとすると、Webサーバーログに生成されたログが表示されます。 * 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>Initialization Paramter</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>Initialization Paramter</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-mapping要素の順序により、WebコンテナがサーブレットまたはJSPにフィルターを適用する順序が決まります。 フィルターの順序を逆にするには、 web.xml ファイルのfilter-mapping要素を逆にするだけです。

たとえば、上記の例では、最初にLogFilterを適用してから、AuthenFilterをサーブレットまたはJSPに適用します。次の例は順序を逆にします-

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