ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     Web アプリケーション   |   前へ   |   次へ   |   目次   |   索引   |   PDF 版

フィルタ

 

この章では、Web アプリケーションでのフィルタの使用に関する情報を提供します。

 


フィルタの概要

フィルタは、Web アプリケーションのリソースに対する要求に応答して呼び出される Java クラスです。リソースには、Java サーブレット、JavaServer Pages(JSP)、および HTTP ページや画像などの静的リソースがあります。フィルタを使用すると、要求をインターセプトして、応答オブジェクトおよび要求オブジェクトを検証したり変更したりするタスクなどを実行できます。

フィルタは、開発者が既存のリソースのコーディングを変更できず、そのリソースの動作を変更する必要がある状況を主に想定した、高度な J2EE 機能です。一般に、フィルタを使ってリソースを変更するよりは、コードを変更してリソースの動作自体を変更した方が効率的です。状況によっては、フィルタを使うことによって、アプリケーションが不必要に複雑になり、パフォーマンスが低下することがあります。

注意: フィルタは、Sun Microsystems が提供する Java サーブレット仕様バージョン 2.3 の新しい機能です。バージョン 2.3 は、サーブレット仕様で提案されている最新のドラフトです。アプリケーションでフィルタを使用する計画がある場合、この仕様がまた確定しておらず、将来、変更される可能性があることに注意してください。

サーブレット 2.3 仕様は、J2EE 1.3 仕様の一部です。J2EE 1.3 機能の使用については、 WebLogic Server 6.1 と J2EE 1.2 および J2EE 1.3を参照してください。

WebLogic Server 6.1 と J2EE 1.2 および J2EE 1.3

BEA WebLogic Server 6.1 は、高度な J2EE 1.3 の機能を実装する最初の e-コマース トランザクション プラットフォームです。J2EE のルールに準拠するために、BEA Systems では 2 つの別個のダウンロードを用意しています。1 つは J2EE 1.3 の機能が有効になっているもの、1 つは J2EE 1.2 の機能に制限されているものです。いずれのダウンロードもコンテナは同じですが、利用可能な API だけ異なります。

J2EE 1.2 の機能に加えて J2EE 1.3 の機能を備える WebLogic Server 6.1

このダウンロードでは、WebLogic Server はデフォルトで J2EE 1.3 の機能を使用して動作します。それらの機能には、EJB 2.0、JSP 1.2、サーブレット 2.3、および J2EE コネクタ アーキテクチャ 1.0 が含まれます。J2EE 1.3 の機能を有効にして WebLogic Server 6.1 を実行しても、J2EE 1.2 アプリケーションはそのままフルサポートされます。J2EE 1.3 機能の実装では、適切な API 仕様の最終ではないバージョンが使用されます。したがって、J2EE 1.3 の新機能を使用する BEA WebLogic Server 6.1 用に開発されたアプリケーション コードは、BEA WebLogic Server の今後のリリースでサポートされる J2EE 1.3 プラットフォームとは互換性を持たない場合があります。

J2EE 1.2 認定の WebLogic Server 6.1

このダウンロードでは、WebLogic Server はデフォルトで J2EE 1.3 機能が無効な状態で動作し、J2EE 1.2 の仕様と規定に完全に準拠します。

フィルタの動作としくみ

フィルタは、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()

このメソッドは、リクエスト オブジェクトと応答オブジェクトの検査と変更、ロギングなど他のタスクの実行、チェーン内の次のフィルタの起動、または、それ以上の処理のブロックのために使います。

GetFilterConfig()

このメソッドは、javax.servlet.FilterConfig オブジェクトへのアクセスを取得するために使います。

setFilterConfig()

このメソッドは、javax.servlet.FilterConfig オブジェクトを設定するために使います。

フィルタの名前、ServletContext、およびフィルタの初期化パラメータにアクセスするために、FilterConfig オブジェクトに対して利用できるメソッドが他にいくつかあります。詳細については、Sun Microsystems の javax.servlet.FilterConfig に関する J2EE Javadoc を参照してください。チェーン内の次の項目(次のフィルタ、または本来のリソースがチェーン内の次の項目である場合は本来のリソース)にアクセスするには、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 page next page