小编典典

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

web.xml

如果我们在WAR自己中定义特定于Webapp的servlet过滤器web.xml,则过滤器的执行顺序将与中定义的顺序相同web.xml

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


阅读 341

收藏
2020-10-01

共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>

如果您希望将网址格式保留在中@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>

2020-10-01