Servlets-writing-filters
サーブレット-フィルターの作成
サーブレットフィルタは、次の目的のためにサーブレットプログラミングで使用できるJavaクラスです-
- バックエンドでリソースにアクセスする前にクライアントからのリクエストをインターセプトする。
- クライアントに返される前にサーバーからの応答を操作するため。
仕様で提案されているフィルターのさまざまな種類があります-
- 認証フィルター。
- データ圧縮フィルター。
- 暗号化フィルター。
- リソースアクセスイベントをトリガーするフィルター。
- 画像変換フィルター。
- ロギングおよび監査フィルター。
- MIME-TYPEチェーンフィルター。
- トークン化フィルター
- XMLコンテンツを変換するXSL/Tフィルター。
フィルターは、デプロイメント記述子ファイル web.xml にデプロイされ、アプリケーションのデプロイメント記述子のサーブレット名またはURLパターンのいずれかにマップされます。
WebコンテナがWebアプリケーションを起動すると、デプロイメント記述子で宣言した各フィルターのインスタンスが作成されます。 フィルターは、デプロイメント記述子で宣言されている順序で実行されます。
サーブレットフィルターメソッド
フィルターは、javax.servlet.Filterインターフェースを実装する単なるJavaクラスです。 javax.servlet.Filterインターフェイスは3つのメソッドを定義します-
Sr.No. | Method & Description |
---|---|
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アプリケーションでは、特定の目的でいくつかの異なるフィルターを定義できます。 _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コンテナがフィルターをサーブレットに適用する順序を決定します。 フィルターの順序を逆にするには、web.xmlファイルのfilter-mapping要素を逆にするだけです。
たとえば、上記の例では、最初に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>