如果我们在WAR自己中定义特定于Webapp的servlet过滤器web.xml,则过滤器的执行顺序将与中定义的顺序相同web.xml。
web.xml
但是,如果我们使用@WebFilter批注定义这些过滤器,那么过滤器的执行顺序是什么,如何确定执行顺序?
您确实不能使用@WebFilter注释定义过滤器执行顺序。但是,为了最大程度地减少web.xml使用量,仅用a注释所有过滤器就足够了,filterName这样您就不需要<filter>定义,而只需<filter-mapping>按所需顺序定义即可。
@WebFilter
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>。
Tomcat 7.0.28