如何在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的。