如何在WAR中使用注释定义servletfilter的执行顺序

如果我们在WAR自己的web.xml定义webapp特定的servletfilter,那么filter的执行顺序将与它们在web.xml中定义的顺序相同。

但是,如果我们使用@WebFilter注释来定义这些filter,那么filter的执行顺序是什么,以及如何确定执行顺序?

您确实可以不使用@WebFilter注释来定义filter执行顺序。 但是,为了尽量减lessweb.xml使用,仅仅使用filterName注释所有的filter就足够了,这样就不需要<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>保留在web.xml ,因为它是XSD所必需的,尽pipe它可以是空的:

 <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,@WebFilter不能在web.xml中使用<filter-mapping>

Servlet 3.0规范似乎没有提供关于容器如何sorting已经通过注释声明的filter的提示。 但是,如何通过web.xml文件中的声明来sortingfilter是很清楚的。

注意安全。 使用具有相互依赖性的web.xml文件顺序filter。 尽量让你的filter独立订购,以尽量减less使用web.xml文件的需要。

可悲的是你必须诉诸一点XML仍然。

检查规范部分8.2,并根据您的打包添加所需的位到web.xml或web-fragment.xml。 注意这些

在web.xml中,您可以按名称过滤和侦听:

 <absolute-ordering> <name>FirstFilter</name> <name>NextFilter</name> </absolute-ordering> 

在web-fragment.xml中,您可以根据名称或一般地使用“其他”标签指定的filter和之前或之后的侦听器。 例如,要尝试先订购JAR,请在web-fragment.xml中使用以下内容

 <order> <before> <others/> </before> </order> 

请注意,除非在应用程序的web.xml中指定,否则JAR的web-fragment.xml顺序以及同一个JAR中的filter或侦听器是任意sorting的。