サーブレット書き込みフィルター


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

  • バックエンド リソースにアクセスする前にクライアントのリクエストをインターセプトします。

  • サーバーからの応答をクライアントに送り返される前に処理します。

仕様に従って推奨されるさまざまなタイプのフィルター:

  • 認証フィルター。

  • データ圧縮フィルター。

  • 暗号化フィルター。

  • リソースアクセスイベントフィルターをトリガーします。

  • 画像変換フィルター。

  • ロギングフィルターと監査フィルター。

  • MIME タイプ チェーン フィルター。

  • トークン化フィルター。

  • XSL/T フィルター (XSL/T フィルター)、XML コンテンツを変換します。

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

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

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

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

シリアル番号メソッドと説明
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
このメソッドは、リクエストが行われる /response ペアは、クライアントがチェーンの終端でリソースをリクエストするためにチェーンを通過するときに、コンテナによって呼び出されます。
2public void init(FilterConfig filterConfig)
このメソッドは、フィルタがサービスに組み込まれていることを示すために Web コンテナによって呼び出されます。
3public void destroy()
このメソッドは、フィルタがサービスから外されたことを示すために Web コンテナによって呼び出されます。

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

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

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// 实现 Filter 类
public class LogFilter implements 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,
                 FilterChain chain) 
                 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( ){
      /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
   }
}

通常の方法で LogFilter.java をコンパイルし、クラス ファイルを < ;Tomcat-installation- に配置します。ディレクトリ>/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 アプリケーションでは、特定の目的に基づいて複数の異なるフィルターを定義できます。 2 つのフィルター AuthenFilterLogFilter を定義するとします。以下で説明するように、別のマッピングを作成する必要があります。残りのプロセスは上記で説明したものとほぼ同じです:

<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 ファイル内の filter-mapping 要素を逆にするだけです。

たとえば、上の例では最初に LogFilter を適用し、次に AuthenFilter を適用しますが、以下の例ではこの順序が逆になります。