小编典典

如何使用 WAR 中的注释定义 servlet 过滤器的执行顺序

all

如果我们在 WAR 自己的 中定义 webapp 特定的 servlet 过滤器web.xml,那么过滤器的执行顺序将与在web.xml.

但是,如果我们使用@WebFilter注解定义这些过滤器,过滤器的执行顺序是什么,我们如何确定执行顺序?


阅读 74

收藏
2022-08-05

共1个答案

小编典典

您确实不能使用@WebFilter注释定义过滤器执行顺序。但是,为了尽量减少web.xml使用,只需使用
a 注释所有过滤器就足够了,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>in 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>.

2022-08-05