BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

Web アプリケーションのアセンブルとコンフィグレーション

 Previous Next Contents Index PDF で侮ヲ  

フィルタ

この章では、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 パターンまたは特定のサーブレットにマップします。宣言できるフィルタの数に制限はありません。

フィルタのコンフィグレーション

フィルタをコンフィグレーションするには、次の手順に従います。

  1. テキスト エディタで web.xml デプロイメント記述子を開くか、Administration Console を使用します。詳細については、Web アプリケーション開発者向けツールを参照してください。web.xml ファイルは、Web アプリケーションの WEB-INF ディレクトリにあります。

  2. フィルタ宣言を追加します。<filter> 要素は、フィルタの宣言、フィルタの名前の定義、およびフィルタを実行する Java クラスの指定を行います。<filter> 要素は、<context-param> 要素のすぐ後ろで、<listener> 要素と <servlet> 要素のすぐ前に指定します。次に例を示します。
    <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>

    icondescriptiondisplay-name の各要素は省略可能です。

  3. <filter> 要素の内部に 1 つまたは複数の初期化パラメータを指定します。次に例を示します。
    <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() メソッドを使って初期化パラメータを読み取ることができます。

  4. フィルタ マッピングを追加します。<filter-mapping> 要素は、URL パターンまたはサーブレット名を基にしてどのフィルタを実行するかを指定します。<filter-mapping> 要素は、<filter> 要素のすぐ後ろに指定します。

  5. フィルタのチェーンを作成するには、複数のフィルタ マッピングを指定します。詳細については、フィルタのチェーンのコンフィグレーションを参照してください。

フィルタのチェーンのコンフィグレーション

WebLogic Server は、送られてくる HTTP リクエストに一致するすべてのフィルタ マッピングのリストを作成することで、フィルタのチェーン を作成します。リストの順序は次の順番で決定します。

  1. リクエストに一致する url-pattern を含む filter-mapping のあるフィルタは、web.xml デプロイメント記述子に記述された順序でチェーンに追加されます。

  2. リクエストに一致する servlet-name を含む filter-mapping のあるフィルタは、URL パターンに一致するフィルタの後でチェーンに追加されます。

  3. チェーン内の最後の項目は常に、本来リクエストされたリソースです。

フィルタ クラスでは、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 クラスの基本構造を示しています。

コード リスト 7-1 フィルタ クラスの例

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 Javadocjavax.servlet.http.HttpServletResponseWrapperjavax.servlet.http.HttpServletRequestWrapper を参照してください。

 


その他の情報源

 

Back to Top Previous Next