web-dev-qa-db-ja.com

フィルタが呼び出される順序は何ですか?

Web.xmlに次のようなものがあるとします。

<filter-mapping>
    <filter-name>F1</filter-name>
    <url-pattern>/XYZ/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>F2</filter-name>
    <url-pattern>/XYZ/abc.do</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>F3</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

リクエストが/XYZ/abc.doとして届いた場合、フィルターが呼び出される順序はどのようになりますか。また、その理由は何ですか。

16
Xyzxyz Xyz

それらのマッピングがweb.xmlで定義されている順序で

アノテーション(@WebFilter)を使用する場合、順序 未定義のようです -web.xmlで<filter-mapping>エントリを宣言する必要があります。

22
Bozho

サーブレット仕様3.0 のセクション6.2.4:

<filter-mapping>スタイルを使用して<url-pattern>要素を処理する場合、コンテナは、第12章「サーブレットへのリクエストのマッピング」で定義されたパスマッピングルールを使用して、<url-pattern>がリクエストURIと一致するかどうかを判断する必要があります。

特定のリクエストURIに適用されるフィルターのチェーンを構築する際にコンテナーが使用する順序は次のとおりです。

  1. まず、これらの要素がデプロイメント記述子に表示されるのと同じ順序で<url-pattern>マッチングフィルターマッピングを実行します。

  2. 次に、これらの要素がデプロイメント記述子に表示されるのと同じ順序で<servlet-name>マッチングフィルターマッピングを実行します。

フィルタマッピングに<servlet-name><url-pattern>の両方が含まれている場合、コンテナはフィルタマッピングを複数のフィルタマッピング(<servlet-name><url-pattern>ごとに1つ)に拡張し、次の順序を維持する必要があります。 <servlet-name>および<url-pattern>要素。

つまり、XMLファイルに表示される順序で適用されます。 <url-pattern><servlet-name>の両方のバインドされたフィルターでカバーされているURLにヒットすると、すべてのURLパターンバインドフィルターがすべてのサーブレット名バインドフィルターの前に適用されるため、興味深いものになります。私はこのような状況にあったことはありませんが(サーブレット名にバインドされたフィルターはまったく見たことがありません)、かなり混乱する可能性があると思います。

20
Barend