サーブレット書き込みフィルター
サーブレット フィルターは、サーブレット プログラミングで使用できる Java クラスであり、次の目的があります:
バックエンド リソースにアクセスする前にクライアントのリクエストをインターセプトします。
サーバーからの応答をクライアントに送り返される前に処理します。
仕様に従って推奨されるさまざまなタイプのフィルター:
認証フィルター。
データ圧縮フィルター。
暗号化フィルター。
リソースアクセスイベントフィルターをトリガーします。
画像変換フィルター。
ロギングフィルターと監査フィルター。
MIME タイプ チェーン フィルター。
トークン化フィルター。
XSL/T フィルター (XSL/T フィルター)、XML コンテンツを変換します。
フィルターは、デプロイメント記述子ファイル web.xml にデプロイされ、アプリケーションのデプロイメント記述子のサーブレット名または URL パターンにマップされます。
Web コンテナが Web アプリケーションを開始すると、デプロイメント記述子で宣言した各フィルターのインスタンスが作成されます。フィルタは、デプロイメント記述子で宣言された順序で実行されます。
サーブレットフィルターメソッド
フィルターは、javax.servlet.Filter インターフェースを実装する Java クラスです。 javax.servlet.Filter インターフェースは 3 つのメソッドを定義します:
シリアル番号 | メソッドと説明 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) このメソッドは、リクエストが行われる /response ペアは、クライアントがチェーンの終端でリソースをリクエストするためにチェーンを通過するときに、コンテナによって呼び出されます。 |
2 | public void init(FilterConfig filterConfig) このメソッドは、フィルタがサービスに組み込まれていることを示すために Web コンテナによって呼び出されます。 |
3 | public 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 つのフィルター AuthenFilter と LogFilter を定義するとします。以下で説明するように、別のマッピングを作成する必要があります。残りのプロセスは上記で説明したものとほぼ同じです:
<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 を適用しますが、以下の例ではこの順序が逆になります。