178

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

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

4

3 回答 3

197

您确实不能使用@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>

于 2011-07-03T08:13:57.820 回答
13

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

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

于 2011-07-03T04:27:27.480 回答
-2
  1. 使 servlet 过滤器实现 spring Ordered 接口。
  2. 在配置类中手动声明 servlet 过滤器 bean。
    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();
        }
    }
于 2020-09-17T10:29:24.223 回答