如果我们在WAR自己的web.xml
中定义特定于webapp的servlet过滤器,那么过滤器的执行顺序将与它们在web.xml
中定义的顺序相同。
但是,如果我们使用@WebFilter
注释定义这些过滤器,那么过滤器的执行顺序是什么?我们如何确定执行的顺序?
发布于 2011-07-03 16:13:58
您确实不能使用@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>
如果你想在@WebFilter
中保留URL模式,那么你可以这样做,
@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>
不管采用哪种方法,在Tomcat7.0.28之前的版本中,这一切都将失败,因为它会在没有<filter>
的情况下抑制<filter-mapping>
的存在。另请参阅Using Tomcat, @WebFilter doesn't work with inside web.xml
发布于 2011-07-03 12:27:27
Servlet 3.0规范似乎没有提供关于容器应该如何对通过注释声明的过滤器进行排序的提示。不过,很清楚如何通过web.xml文件中的声明对过滤器进行排序。
注意安全。使用具有相互依赖性的web.xml文件顺序筛选器。尽量使您的过滤器的所有顺序独立,以最大限度地减少使用web.xml文件的需要。
https://stackoverflow.com/questions/6560969
复制相似问题