ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server Web アプリケーション、サーブレット、JSP の開発
11g リリース 1 (10.3.1)
B55521-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

14 フィルタ

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

フィルタの概要

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

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

フィルタの動作と仕組み

フィルタは、Web アプリケーションのコンテキストで定義します。フィルタは特定の名前のリソースまたはリソースのグループ (URL パターンに基づく) に対する要求をインターセプトして、フィルタ内でコードを実行します。それぞれのリソースまたはリソースのグループに対して、単一のフィルタ、またはチェーンと呼ばれる特定の順序で起動される複数のフィルタを指定できます。

フィルタは、要求をインターセプトするとき、HTTP リクエストと応答へのアクセスを提供する javax.servlet.ServletRequest オブジェクトと javax.servlet.ServletResponse オブジェクト、および javax.servlet.FilterChain オブジェクトにアクセスできます。FilterChain オブジェクトには、順番に起動できるフィルタのリストが含まれています。フィルタは、作業を終了すると、チェーン内の次のフィルタを起動する、要求をブロックする、例外を送出する、本来要求されていたリソースを起動する、のうちのいずれかの処理を行うことができます。

本来のリソースが起動されると、制御は、チェーン内のリストの最後にあるフィルタに返されます。そのあとで、このフィルタは、応答ヘッダとデータの検査および変更、要求のブロック、例外の送出、チェーンの最後より 1 つ手前にあるフィルタの起動のいずれかを行うことができます。この処理はフィルタのチェーン内において逆順で続行されます。


注意 :

フィルタでヘッダを変更できるのは、応答がまだコミットされていない場合のみです。

フィルタの用途

フィルタは次の機能を行うときに便利です。

  • ロギング機能の実装

  • ユーザが作成したセキュリティ機能の実装

  • デバッグ

  • 暗号化

  • データの圧縮

  • クライアントに送信される応答の変更 (ただし、応答の後処理を行うと、アプリケーションのパフォーマンスが低下するおそれがあります)

フィルタ クラスの作成

フィルタ クラスを作成するには、javax.servlet.Filter インタフェース (http://java.sun.com/j2ee/tutorial/api/javax/servlet/Filter.html を参照) を実装します。このインタフェースの次のメソッドを実装する必要があります。

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

フィルタの名前、ServletContext、およびフィルタの初期化属性にアクセスするために、FilterConfig オブジェクトに対して利用できるメソッドが他にいくつかあります。詳細については、Sun Microsystems の J2EE Javadoc (http://java.sun.com/j2ee/tutorial/api/index.html) で javax.servlet.FilterConfig を参照してください。

チェーン内の次の項目 (別のフィルタや元のリソースなどの場合がある) にアクセスするには、FilterChain.doFilter() メソッドを呼び出します。

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

Web アプリケーションの web.xml デプロイメント記述子を使って、フィルタをアプリケーションの一部としてコンフィグレーションします。デプロイメント記述子では、フィルタを指定してから、そのフィルタを Web アプリケーションの URL パターンまたは特定のサーブレットにマップします。指定できるフィルタの数に制限はありません。

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

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

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

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

    <context-param>Param</context-param>
    <filter>
      <icon>
        <small-icon>MySmallIcon.gif</small-icon>
        <large-icon>MyLargeIcon.gif</large-icon>
      </icon>
      <filter-name>myFilter</filter-name>
      <display-name>My Filter</display-name>
      <description>This is my filter</description>
      <filter-class>examples.myFilterClass</filter-class>
    </filter>
    <listener>Listener</listener>
    <servlet>Servlet</servlet>
    

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

  3. filter 要素の内部に 1 つまたは複数の初期化属性を指定します。次に例を示します。

    <filter>
      <icon>
        <small-icon>MySmallIcon.gif</small-icon>
        <large-icon>MyLargeIcon.gif</large-icon>
      </icon>
      <filter-name>myFilter</filter-name>
      <display-name>My Filter</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 要素 (群) のすぐ後ろに指定します。

    • URL パターンを使ったフィルタ マッピングを作成するには、フィルタの名前と URL パターンを指定します。URL パターン マッチングは、Sun Microsystems の Servlet 2.4 仕様 (http://java.sun.com/products/servlet/download.html#specs) のセクション 11.1 に指定されているルールに従って実行されます。たとえば、次の filter-mapping/myPattern/ を含む要求に myFilter をマップします。

      <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/myPattern/*</url-pattern>
      </filter-mapping>
      
    • 特定のサーブレットに対するフィルタ マッピングを作成するには、Web アプリケーションに登録されたサーブレットの名前にフィルタをマップします。たとえば、次のコードは myServlet というサーブレットに myFilter フィルタをマップします。

      <filter-mapping>
        <filter-name>myFilter</filter-name>
        <servlet-hame>myServlet</servlet-name>
      </filter-mapping>
      
  5. フィルタのチェーンを作成するには、複数のフィルタ マッピングを指定します。詳細については、「フィルタのチェーンのコンフィグレーション」を参照してください。

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

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

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

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

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

フィルタ クラスでは、FilterChain.doFilter() メソッドを使ってチェーン内の次の項目を起動します。

サーブレット応答オブジェクトでのフィルタ処理

サーブレットによって生成された出力にデータを追加することで、フィルタをサーブレットの出力の後処理に使用できます。ただし、サーブレットの出力を取り込むには、応答にラッパーを作成する必要があります (サーブレットが実行を完了し、制御がチェーン内の最後のフィルタに戻される前に、サーブレットの出力バッファは自動的にフラッシュされ、クライアントに送信されるので、本来の応答オブジェクトは使用できません)。そのようなラッパーを作成すると、WebLogic Server はメモリで出力の追加コピーを処理する必要が生じ、パフォーマンスが低下することがあります。

応答オブジェクトや要求オブジェクトのラッピングの詳細については、http://java.sun.com/j2ee/tutorial/api/index.htmljavax.servlet.http.HttpServletResponseWrapperjavax.servlet.http.HttpServletRequestWrapper を参照してください。

その他の情報源