siv*_*636 163 web.xml servlets java-ee servlet-filters order-of-execution
如果我们在WAR自己定义特定于webapp的servlet过滤器web.xml,那么过滤器的执行顺序将与它们在中定义的顺序相同web.xml.
但是,如果我们使用@WebFilter注释定义这些过滤器,过滤器的执行顺序是什么,我们如何确定执行顺序?
Bal*_*usC 177
您确实无法使用@WebFilter注释定义过滤器执行顺序.但是,为了最大限度地减少web.xml使用,仅使用a来注释所有过滤器就足够了,filterName这样您就不需要<filter>定义,只需<filter-mapping>要按所需顺序定义.
例如,
@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}
@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
如果您想保留URL模式@WebFilter,那么您可以这样做,
@WebFilter(filterName="filter1", urlPatterns="/url1/*")
public class Filter1 implements Filter {}
@WebFilter(filterName="filter2", urlPatterns="/url2/*")
public class Filter2 implements Filter {}
Run Code Online (Sandbox Code Playgroud)
但你还是应该保持<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>
Run Code Online (Sandbox Code Playgroud)
无论采用何种方法,这一切都将在Tomcat中失败,直到版本7.0.28,因为它会因为<filter-mapping>没有存在而窒息<filter>.另请参阅使用Tomcat,@ WebFilter不能与web.xml中的<filter-mapping>一起使用
vkr*_*mer 12
Servlet 3.0规范似乎没有提供容器如何订购通过注释声明的过滤器的提示.很明显,如何通过web.xml文件中的声明来命令过滤器.
注意安全.使用具有相互依赖性的web.xml文件顺序筛选器.尝试使您的过滤器所有顺序独立,以最大限度地减少使用web.xml文件的需要.