BEA ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Server > Web アプリケーションのアセンブルとコンフィグレーション > フィルタ |
Web アプリケーションのアセンブルとコンフィグレーション
|
この章では、Web アプリケーションでのフィルタの使用に関する情報を提供します。
フィルタとは、Web アプリケーションのリソースに対するリクエストに応答して起動される Java クラスのことです。リソースには、Java サーブレット、JavaServer pages (JSP)、および HTTP ページや画像などの静的リソースがあります。フィルタを使用すると、要求をインターセプトして、応答オブジェクトおよび要求オブジェクトを検証したり変更したりするタスクなどを実行できます。
フィルタは、開発者が既存のリソースのコーディングを変更できず、そのリソースの動作を変更する必要がある状況を主に想定した、高度な J2EE 機能です。一般に、フィルタを使ってリソースを変更するよりは、コードを変更してリソースの動作自体を変更した方が効率的です。状況によっては、フィルタを使うことによって、アプリケーションが不必要に複雑になり、パフォーマンスが低下することがあります。
フィルタは、Web アプリケーションのコンテキストで定義します。フィルタは特定の名前のリソースまたはリソースのグループ (URL パターンに基づく) に対するリクエストを横取りして、フィルタ内でコードを実行します。それぞれのリソースまたはリソースのグループに対して、単一のフィルタ、またはチェーンと呼ばれる特定の順序で起動される複数のフィルタを指定できます。
フィルタは、リクエストを横取りするとき、HTTP リクエストと応答へのアクセスを提供する javax.servlet.ServletRequest オブジェクトと javax.servlet.ServletResponse オブジェクト、および javax.servlet.FilterChain オブジェクトにアクセスできます。FilterChain オブジェクトには、順番に起動できるフィルタのリストが含まれています。フィルタは、作業を終了すると、チェーン内の次のフィルタを起動する、リクエストをブロックする、例外を送出する、本来リクエストされていたリソースを起動する、のうちのいずれかの処理を行うことができます。
本来のリソースが起動されると、制御は、チェーン内のリストの最後にあるフィルタに返されます。そのあとで、このフィルタは、応答ヘッダとデータの検査および変更、リクエストのブロック、例外の送出、チェーンの最後より 1 つ手前にあるフィルタの起動のいずれかを行うことができます。この処理はフィルタのチェーン内において逆順で続行されます。
Web アプリケーションの web.xml デプロイメント記述子を使って、フィルタをアプリケーションの一部としてコンフィグレーションします。デプロイメント記述子では、フィルタを宣言してから、そのフィルタを Web アプリケーションの URL パターンまたは特定のサーブレットにマップします。宣言できるフィルタの数に制限はありません。
フィルタをコンフィグレーションするには、次の手順に従います。
<filter>
<icon>
<small-icon>MySmallIcon.gif</small-icon>
<large-icon>MyLargeIcon.gif</large-icon>
</icon>
<filter-name>myFilter1</filter-name>
<display-name>filter 1</display-name>
<description>This is my filter</description>
<filter-class>examples.myFilterClass</filter-class>
</filter>
<filter>
<icon>
<small-icon>MySmallIcon.gif</small-icon>
<large-icon>MyLargeIcon.gif</large-icon>
</icon>
<filter-name>myFilter1</filter-name>
<display-name>filter 1</display-name>
<description>This is my filter</description>
<filter-class>examples.myFilterClass</filter-class>
<init-param>
<param-name>myInitParam</param-name>
<param-value>myInitParamValue</param-value>
</init-param>
</filter>
Filter クラスは FilterConfig.getInitParameter() メソッドまたは FilterConfig.getInitParameters() メソッドを使って初期化パラメータを読み取ることができます。
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/myPattern/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-hame>myServlet</servlet-name>
</filter-mapping>
WebLogic Server は、送られてくる HTTP リクエストに一致するすべてのフィルタ マッピングのリストを作成することで、フィルタのチェーン を作成します。リストの順序は次の順番で決定します。
フィルタ クラスでは、FilterChain.doFilter() メソッドを使ってチェーン内の次の項目を起動します。
フィルタ クラスを作成するには、javax.servlet.Filter インタフェースを実装しますこのインタフェースの次のメソッドを実装する必要があります。
doFilter() メソッドは、リクエスト オブジェクトと応答オブジェクトの検査と変更、ロギングなど他のタスクの実行、チェーン内の次のフィルタの起動、または、それ以上の処理のブロックのために使います。
フィルタの名前、ServletContext、およびフィルタの初期化属性にアクセスするために、FilterConfig オブジェクトに対して利用できるメソッドが他にいくつかあります。詳細については、Sun Microsystems の javax.servlet.FilterConfig に関する J2EE Javadoc を参照してください。Javadoc は、http://java.sun.com/j2ee/tutorial/api/index.html から利用できます。
チェーン内の次の項目 (次のフィルタ、または本来のリソースがチェーン内の次の項目である場合は本来のリソース) にアクセスするには、FilterChain.doFilter() メソッドを呼び出します。
次のコード例は、Filter クラスの基本構造を示しています。
import javax.servlet.*;
public class Filter1Impl implements Filter
{
private FilterConfig filterConfig;
public void doFilter(ServletRequest req,
ServletResponse res, FilterChain fc)
throws java.io.IOException, javax.servlet.ServletException
{
// ロギングなどのタスクを実行
//...
fc.doFilter(req,res); // チェーン内の次の項目 (別のフィルタ
// または元々要求されていたリソースの
// いずれか) を呼び出す
}
public FilterConfig getFilterConfig()
{
// タスクの実行
return filterConfig;
}
public void setFilterConfig(FilterConfig cfg)
{
// タスクの実行
filterConfig = cfg;
}
}
サーブレットによって生成された出力にデータを追加することで、フィルタをサーブレットの出力の後処理に使用できます。ただし、サーブレットの出力を取り込むには、応答にラッパーを作成する必要があります (サーブレットが実行を完了し、制御がチェーン内の最後のフィルタに戻される前に、サーブレットの出力バッファは自動的にフラッシュされ、クライアントに送信されるので、本来の応答オブジェクトは使用できません)。そのようなラッパーを作成すると、WebLogic Server はメモリで出力の追加コピーを処理する必要が生じ、パフォーマンスが低下することがあります。
応答オブジェクトやリクエスト オブジェクトのラッピングの詳細については、Sun Microsystems の J2EE Javadoc の javax.servlet.http.HttpServletResponseWrapper と javax.servlet.http.HttpServletRequestWrapper を参照してください。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |