如果我们在 WAR 自己的 中定义 webapp 特定的 servlet 过滤器web.xml
,那么过滤器的执行顺序将与在web.xml
.
但是,如果我们使用@WebFilter
注解定义这些过滤器,过滤器的执行顺序是什么,我们如何确定执行顺序?
如果我们在 WAR 自己的 中定义 webapp 特定的 servlet 过滤器web.xml
,那么过滤器的执行顺序将与在web.xml
.
但是,如果我们使用@WebFilter
注解定义这些过滤器,过滤器的执行顺序是什么,我们如何确定执行顺序?
您确实不能使用@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>
如果您想将 URL 模式保留在 中@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>
Servlet 3.0 规范似乎没有提供关于容器应如何排序已通过注释声明的过滤器的提示。不过,很清楚如何通过 web.xml 文件中的声明对过滤器进行排序。
注意安全。使用具有相互依赖性的 web.xml 文件顺序过滤器。尝试使您的过滤器的所有顺序独立,以尽量减少使用 web.xml 文件的需要。
import org.springframework.core.Ordered;
public class MyFilter implements Filter, Ordered {
@Override
public void init(FilterConfig filterConfig) {
// do something
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// do something
}
@Override
public void destroy() {
// do something
}
@Override
public int getOrder() {
return -100;
}
}
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class MyAutoConfiguration {
@Bean
public MyFilter myFilter() {
return new MyFilter();
}
}