您确实不能使用@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>
无论采用何种方法,这一切都将在 Tomcat 中失败,直到版本 7.0.28,因为它会在没有 <filter> 的情况下出现 <filter-mapping> 时窒息。另见Using Tomcat, @WebFilter doesn't work with <filter-mapping> inside web.xml