![]() ![]() ![]() ![]() |
この章では、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 インターフェースを実装します。このインタフェースの次のメソッドを実装する必要があります。
doFilter()
メソッドは、要求オブジェクトと応答オブジェクトの検査と変更、ロギングなど他のタスクの実行、チェーン内の次のフィルタの起動、または、それ以上の処理のブロックのために使います。
フィルタの名前、ServletContext
、およびフィルタの初期化属性にアクセスするために、FilterConfig
オブジェクトに対して利用できるメソッドが他にいくつかあります。詳細については、Sun Microsystems の J2EE Javadoc で javax.servlet.FilterConfig
を参照してください。チェーン内の次の項目 (別のフィルタや元のリソースなどの場合がある) にアクセスするには、FilterChain.doFilter()
メソッドを呼び出します。
Web アプリケーションの web.xml
デプロイメント記述子を使って、フィルタをアプリケーションの一部としてコンフィグレーションします。デプロイメント記述子では、フィルタを指定してから、そのフィルタを Web アプリケーションの URL パターンまたは特定のサーブレットにマップします。指定できるフィルタの数に制限はありません。
フィルタをコンフィグレーションするには、次の手順に従います。
web.xml
デプロイメント記述子を開くか、Administration Console を使用します。詳細については、「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>
</filter>
<param-name>myInitParam</param-name>
<param-value>myInitParamValue</param-value>
</init-param>
Filter
クラスは FilterConfig.getInitParameter()
メソッドまたは FilterConfig.getInitParameters()
メソッドを使って初期化属性を読み取ることができます。
filter-mapping
要素は、URL パターンまたはサーブレット名を基にしてどのフィルタを実行するかを指定します。filter-mapping
要素は、filter
要素 (群) のすぐ後ろに指定します。filter-mapping
は /myPattern/
を含む要求に myFilter
をマップします。<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/myPattern/*</url-pattern>
</filter-mapping>
myServlet
というサーブレットに myFilter
フィルタをマップします。<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-hame>myServlet</servlet-name>
</filter-mapping>
WebLogic Server は、送られてくる HTTP リクエストに一致するすべてのフィルタ マッピングのリストを作成することで、フィルタのチェーンを作成します。リストの順序は次の順番で決定します。
フィルタ クラスでは、FilterChain.doFilter()
メソッドを使ってチェーン内の次の項目を起動します。
サーブレットによって生成された出力にデータを追加することで、フィルタをサーブレットの出力の後処理に使用できます。ただし、サーブレットの出力を取り込むには、応答にラッパーを作成する必要があります (サーブレットが実行を完了し、制御がチェーン内の最後のフィルタに戻される前に、サーブレットの出力バッファは自動的にフラッシュされ、クライアントに送信されるので、本来の応答オブジェクトは使用できません)。そのようなラッパーを作成すると、WebLogic Server はメモリで出力の追加コピーを処理する必要が生じ、パフォーマンスが低下することがあります。
応答オブジェクトや要求オブジェクトのラッピングの詳細については、Sun Microsystems の J2EE Javadoc の javax.servlet.http.HttpServletResponseWrapper
と javax.servlet.http.HttpServletRequestWrapper
を参照してください。
![]() ![]() ![]() |