web-dev-qa-db-ja.com

WARの注釈を使用してサーブレットフィルターの実行順序を定義する方法

WARのweb.xmlでwebapp固有のサーブレットフィルターを定義する場合、フィルターの実行順序は、web.xmlで定義されている順序と同じになります。

しかし、@WebFilter注釈を使用してこれらのフィルターを定義する場合、フィルターの実行順序はどのようになり、実行順序をどのように決定できますか?

163
siva636

@WebFilter アノテーションを使用して、フィルターの実行順序を実際に定義することはできません。ただし、web.xmlの使用を最小限に抑えるには、<filter>の定義は必要なく、<filter-mapping>の定義を必要な順序でのみ必要とするように、すべてのフィルターにfilterNameだけで注釈を付けるだけで十分です。

例えば、

@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}

web.xmlでこれだけ:

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/url1/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern>/url2/*</url-pattern>
</filter-mapping>

URLパターンを@WebFilterに保持したい場合は、そのようにすることができます。

@WebFilter(filterName="filter1", urlPatterns="/url1/*")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2", urlPatterns="/url2/*")
public class Filter2 implements Filter {}

ただし、<url-pattern>web.xmlに保持する必要があります。XSDごとに必要ですが、空でもかまいません。

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern />
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern />
</filter-mapping>

アプローチに関係なく、Tomcatでは、バージョン7.0.28までは、<filter-mapping>を使用せずに<filter>が存在するため、これがすべて失敗します。 Tomcatを使用すると、@ WebFilterはweb.xml内の<filter-mapping>で動作しません

177
BalusC

Servlet 3.0の仕様は、アノテーションを介して宣言されたフィルターをコンテナーがどのように順序付けするべきかについてのヒントを提供していないようです。ただし、web.xmlファイルの宣言を使用してフィルターを注文する方法については明確です。

安全である。相互依存関係があるweb.xmlファイル順序フィルターを使用します。 web.xmlファイルを使用する必要性を最小限に抑えるために、フィルターをすべて順序に依存しないようにしてください。

11
vkraemer

@WebFilterには、フィルターの実行順序を定義する要素がありません。必要な場合は、web.xmlを選択する必要があります。

0
luis-br