如果我们在 WAR 自己的 中定义 webapp 特定的 servlet 过滤器web.xml,那么过滤器的执行顺序将与在web.xml.
web.xml
但是,如果我们使用@WebFilter注解定义这些过滤器,过滤器的执行顺序是什么,我们如何确定执行顺序?
@WebFilter
您确实不能使用@WebFilter注释定义过滤器执行顺序。但是,为了尽量减少web.xml使用,只需使用 a 注释所有过滤器就足够了,filterName这样您就不需要<filter>定义,而只需<filter-mapping>按所需顺序进行定义。
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 所必需的,尽管它可以为空:
<url-pattern>
<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>.