WARのweb.xml
でwebapp固有のサーブレットフィルターを定義する場合、フィルターの実行順序は、web.xml
で定義されている順序と同じになります。
しかし、@WebFilter
注釈を使用してこれらのフィルターを定義する場合、フィルターの実行順序はどのようになり、実行順序をどのように決定できますか?
@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>で動作しません
Servlet 3.0の仕様は、アノテーションを介して宣言されたフィルターをコンテナーがどのように順序付けするべきかについてのヒントを提供していないようです。ただし、web.xmlファイルの宣言を使用してフィルターを注文する方法については明確です。
安全である。相互依存関係があるweb.xmlファイル順序フィルターを使用します。 web.xmlファイルを使用する必要性を最小限に抑えるために、フィルターをすべて順序に依存しないようにしてください。
@WebFilterには、フィルターの実行順序を定義する要素がありません。必要な場合は、web.xmlを選択する必要があります。