1. ホーム
  2. servlets

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

2022-04-21 01:14:16

質問

Webアプリケーション固有のサーブレットフィルタをWAR自身の web.xml で定義された順序と同じになります。 web.xml .

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

どのように解決するのですか?

フィルタの実行順序を定義することはできません。 @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 {}

を使用する必要がありますが、それでも <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>

いずれの方法でも、バージョン 7.0.28 までは、Tomcat では <filter-mapping> でなく <filter> . 参照 Tomcat で、web.xml 内に <filter-mapping> を記述すると @WebFilter が動作しない。