Oracle® Fusion Middleware Oracle WebLogic Server Webアプリケーション、サーブレット、JSP の開発 11g リリース1 (10.3.5) B60993-03 |
|
前 |
次 |
この章では、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
を参照)を実装します。このインタフェースの次のメソッドを実装する必要があります。
init()
destroy()
doFilter()
doFilter()
メソッドは、リクエスト・オブジェクトとレスポンス・オブジェクトの検査と変更、ロギングなど他のタスクの実行、チェーン内の次のフィルタの起動、または、それ以上の処理のブロックのために使います。
フィルタの名前、ServletContext
、およびフィルタの初期化属性にアクセスするために、FilterConfig
オブジェクトに対して利用できるメソッドが他にいくつかあります。詳細は、J2EE Javadoc (http://java.sun.com/j2ee/tutorial/api/index.html
)でjavax.servlet.FilterConfig
を参照してください。
チェーン内の次の項目(別のフィルタや元のリソースなどの場合があります)にアクセスするには、FilterChain.doFilter()
メソッドを呼び出します。
Webアプリケーションのweb.xml
デプロイメント記述子を使って、フィルタをアプリケーションの一部として構成します。デプロイメント記述子では、フィルタを指定してから、そのフィルタをWebアプリケーションのURLパターンまたは特定のサーブレットにマップします。指定できるフィルタの数に制限はありません。
フィルタを構成するには:
テキスト・エディタでweb.xml
デプロイメント記述子をオープンするか、管理コンソールを使用します。詳細は、「Webアプリケーション開発者向けツール」を参照してください。web.xml
ファイルは、WebアプリケーションのWEB-INF
ディレクトリにあります。
フィルタ宣言を追加します。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>
icon
、description
、display-name
の各要素は省略可能です。
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()
メソッドを使って初期化属性を読み取ることができます。
フィルタ・マッピングを追加します。filter-mapping
要素は、URLパターンまたはサーブレット名を基にしてどのフィルタを実行するかを指定します。filter-mapping
要素は、filter
要素(群)のすぐ後ろに指定します。
URLパターンを使ったフィルタ・マッピングを作成するには、フィルタの名前とURLパターンを指定します。URLパターン・マッチングは、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>
フィルタのチェーンを作成するには、複数のフィルタ・マッピングを指定します。詳細は、「フィルタのチェーンの構成」を参照してください。
WebLogic Serverは、送られてくるHTTPリクエストに一致するすべてのフィルタ・マッピングのリストを作成することで、フィルタのチェーンを作成します。リストの順序は次の順番で決定します。
リクエストに一致するurl-pattern
を含むfilter-mapping
要素のあるフィルタは、web.xml
デプロイメント記述子に記述された順序でチェーンに追加されます。
リクエストに一致するservlet-name
を含むfilter-mapping
要素のあるフィルタは、URLパターンに一致するフィルタの後でチェーンに追加されます。
チェーン内の最後の項目は常に、最初にリクエストされたリソースです。
フィルタ・クラスでは、FilterChain.doFilter()
メソッドを使ってチェーン内の次の項目を起動します。
サーブレットによって生成された出力にデータを追加することで、フィルタをサーブレットの出力の後処理に使用できます。ただし、サーブレットの出力を取り込むには、レスポンスにラッパーを作成する必要があります(サーブレットが実行を完了し、制御がチェーン内の最後のフィルタに戻される前に、サーブレットの出力バッファは自動的にフラッシュされ、クライアントに送信されるので、本来のレスポンス・オブジェクトは使用できません)。そのようなラッパーを作成すると、WebLogic Serverはメモリーで出力の追加コピーを処理する必要が生じ、パフォーマンスが低下することがあります。
レスポンス・オブジェクトやリクエスト・オブジェクトのラッピングの詳細は、http://java.sun.com/j2ee/tutorial/api/index.html
のjavax.servlet.http.HttpServletResponseWrapper
とjavax.servlet.http.HttpServletRequestWrapper
を参照してください。
Servlet 2.4仕様書(http://java.sun.com/products/servlet/download.html#specs
)
J2EE APIリファレンス(Javadoc) (http://java.sun.com/j2ee/tutorial/api/index.html
)
J2EEチュートリアル(http://java.sun.com/j2ee/tutorial/1_3-fcs/index.html
)