WARのアノテーションを使用してサーブレットフィルターの実行順序を定義する方法


167

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

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

回答:


187

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

例えば、

@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 {}

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

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

それはの存在にチョークのでかかわらず、アプローチの、このすべては、バージョン7.0.28までのTomcatに失敗します<filter-mapping>なし<filter>Tomcatの使用も参照してください。@ WebFilterは、web.xml内の<filter-mapping>では機能しません。


5
orderネストされた@WebFilterMappingアノテーションの属性を導入することもできます。単純化のためにがそれをしなかったかどうか疑問に思います
Bozho

12
@Bozho:それは十分に具体的ではないでしょう。フィルターを含むサードパーティライブラリがWebアプリケーションに同梱されている場合はどうなりますか?事前に注文するのは難しいです。
BalusC、2011年

1
@BalusC:例で問題が発生しました:url-patternがフィルター名で閉じられています。
AndrewBourgeois

3
@AndrewBourgeois:修正されました。コピーペーストエラーでした。MarkdownエディターにEclipseのような組み込みのXML検証がないことは
残念

6
<url-pattern />JBoss EAP 6.1では使用できません- @WebFilter値が上書きされ、フィルターが実行されなくなります。
seanf 2013年

12

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

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


4
私のプロジェクトには多くのサーブレットフィルターがありますが、その中から特定のフィルターのみを最初に呼び出す必要があり、他のフィルターの順序は関係ありません。web.xmlのすべてのフィルターを汚す必要がありますか?または、ショートカットはありますか?
siva636
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.