如何使用WAR中的注释定义servlet过滤器的执行顺序


167

如果我们在WAR自己中定义特定于Webapp的servlet过滤器web.xml,则过滤器的执行顺序将与中定义的顺序相同web.xml

但是,如果我们使用@WebFilter批注定义这些过滤器,那么过滤器的执行顺序是什么,如何确定执行顺序?

Answers:


187

您确实不能使用@WebFilter注释定义过滤器执行顺序。但是,为了最大程度地减少web.xml使用量,仅用a注释所有过滤器就足够了,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,@ WebFilter不适用于web.xml中的<filter-mapping>


5
他们可以引入order嵌套@WebFilterMapping注释的属性。我不知道是否没有为了简单做
Bozho

12
@Bozho:那还不够具体。如果您的Web应用程序随附包含过滤器的第三方库,该怎么办?很难事先告知其顺序。
BalusC,

1
@BalusC:您的示例出了点问题:url-pattern用过滤器名称关闭。
AndrewBourgeois 2012年

3
@AndrewBourgeois:固定。是一个复制粘贴错误。太糟糕了,Markdown编辑器没有像Eclipse中那样内置XML验证;)
BalusC,2012年

6
使用<url-pattern />在JBoss EAP 6.1上不起作用-它会覆盖该@WebFilter值并完全阻止过滤器运行。
seanf

12

Servlet 3.0规范似乎并未提供有关容器如何排序已通过注释声明的过滤器的提示。显然,如何通过web.xml文件中的过滤器排序来排序过滤器。

注意安全。使用具有相互依赖性的web.xml文件顺序过滤器。尝试使过滤器的所有顺序独立,以最大程度地减少使用web.xml文件的需要。


4
我的项目中有许多Servlet过滤器,其中只有一个特定的过滤器必须首先被调用,其他过滤器的顺序无关紧要。我是否必须删除web.xml中的所有过滤器?还是有捷径?
siva636'7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.