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

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>一起使用

  • @Bozho:那不够具体.如果您的webapp附带包含过滤器的第三方库,该怎么办?事先告诉它的订单很难. (10认同)
  • 他们可以引入嵌套的`@WebFilterMapping`注释的`order`属性.我想知道是不是为了简单而不这样做 (5认同)
  • 使用`<url-pattern />`在JBoss EAP 6.1上不起作用 - 它会覆盖`@WebFilter`值并阻止过滤器运行. (5认同)
  • @AndrewBourgeois:固定.是一个copypaste错误.太糟糕了,Markdown编辑器没有内置的XML验证,就像在Eclipse中一样;) (2认同)

vkr*_*mer 12

Servlet 3.0规范似乎没有提供容器如何订购通过注释声明的过滤器的提示.很明显,如何通过web.xml文件中的声明来命令过滤器.

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

  • 我的项目中有很多Servlet过滤器,其中只有一个特定的过滤器必须首先调用,其他过滤器的顺序不是问题.我是否必须在web.xml中玷污所有过滤器?还是有任何捷径? (4认同)