サーブレット-フィルタの作成

サーブレットフィルタは、次の目的でサーブレットプログラミングで使用できるJavaクラスです。

  • クライアントがバックエンドでリソースにアクセスする前に、クライアントからの要求をインターセプトするため。

  • クライアントに返送される前にサーバーからの応答を操作するため。

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

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

フィルタはデプロイメント記述子ファイルにデプロイされます web.xml 次に、アプリケーションのデプロイメント記述子のサーブレット名またはURLパターンのいずれかにマップします。

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

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

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

シニア番号 方法と説明
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

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

2

public void init(FilterConfig filterConfig)

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

3

public void destroy()

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

サーブレットフィルタ-例

以下は、クライアントのIPアドレスと現在の日時を出力するサーブレットフィルターの例です。この例では、サーブレットフィルタの基本を理解できますが、同じ概念を使用して、より高度なフィルタアプリケーションを作成できます。

// 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 通常の方法で、クラスファイルを<Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classesに配置します

Web.xmlでのサーブレットフィルタマッピング

フィルタは、サーブレットが定義されてからURLパターンにマップされるのとほぼ同じ方法で、定義されてからURLまたはサーブレットにマップされます。デプロイメント記述子ファイルにフィルタータグの次のエントリを作成します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>

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

次に、通常の方法でサーブレットを呼び出そうとすると、生成されたログがWebサーバーのログに表示されます。Log4Jロガーを使用して、上記のログを別のファイルに記録できます。

複数のフィルターの使用

Webアプリケーションは、特定の目的でいくつかの異なるフィルターを定義する場合があります。AuthenFilterLogFilterの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のフィルターマッピング要素の順序によって、Webコンテナーがサーブレットにフィルターを適用する順序が決まります。フィルタの順序を逆にするには、web.xmlファイルのフィルタマッピング要素を逆にする必要があります。

たとえば、上記の例では最初に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>