JSPフィルター


サーブレットおよび JSP のフィルターは、次の目的で存在する Java クラスです:

  • バックエンド リソースへのアクセス要求が行われたときのインターセプト

  • サーバーからクライアントに返される応答を管理する

以下に、一般的に使用されるフィルターの種類をいくつか示します。

  • 認証フィルター

  • データ圧縮フィルター

  • 暗号化フィルター

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

  • 画像変換フィルター

  • ログインおよび認証フィルター

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

  • トークン フィルター

  • XSL/T XML コンテンツを変換するフィルター

それを web.xml ファイルに挿入し、その名前をマッピングしますサーブレット、JSP ファイル、または URL パターン。デプロイメント記述ファイル web.xml は、<Tomcat-installation-directory>conf ディレクトリにあります。

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


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

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

数値 メソッド & 説明
1 public void doFilter (サーブレット)リクエスト、サーブレット応答、フィルターチェーン)


クライアントはチェーンの最後でリソースをリクエストするため、リクエスト/レスポンスがフィルターチェーンを通過するたびにコンテナはこのメソッドを呼び出します
2public void init(FilterConfig filterConfig)


コンテナは、サービスにフィルタが配置されていることを示すためにこのメソッドを呼び出します
3public void destroy()


コンテナは、フィルタがサービスから削除されていることを示すためにこのメソッドを呼び出します

JSP フィルターの例

この例では、JSP ファイルへの各アクセスの 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实例在服务器上被移除前调用。*/
   }
}

LogFilter.java ファイルをコンパイルし、コンパイルされたクラス ファイルを <Tomcat インストール ディレクトリ>/webapps/ROOT/WEB-INF/classes ディレクトリに配置します。


Web での 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>Initialization Paramter</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>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> 要素は、コンテナがこれらのフィルターを適用する順序を決定します。アプリケーションの順序を逆にするには、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>