首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用WAR中的注释定义servlet过滤器的执行顺序

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

Stack Overflow用户
提问于 2011-07-03 11:38:00
回答 2查看 111.7K关注 0票数 178

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-03 16:13:58

您确实不能使用@WebFilter注释来定义过滤器的执行顺序。但是,为了最大限度地减少web.xml使用量,只需使用filterName注释所有过滤器就足够了,这样您就不需要<filter>定义,只需要按所需的顺序使用<filter-mapping>定义即可。

例如,

代码语言:javascript
复制
@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}

web.xml中,仅仅是这样:

代码语言:javascript
复制
<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中保留URL模式,那么你可以这样做,

代码语言:javascript
复制
@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所必需的,尽管它可以是空的:

代码语言:javascript
复制
<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern />
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern />
</filter-mapping>

不管采用哪种方法,在Tomcat7.0.28之前的版本中,这一切都将失败,因为它会在没有<filter>的情况下抑制<filter-mapping>的存在。另请参阅Using Tomcat, @WebFilter doesn't work with inside web.xml

票数 196
EN

Stack Overflow用户

发布于 2011-07-03 12:27:27

Servlet 3.0规范似乎没有提供关于容器应该如何对通过注释声明的过滤器进行排序的提示。不过,很清楚如何通过web.xml文件中的声明对过滤器进行排序。

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6560969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档