Как определить порядок выполнения фильтра сервлетов с помощью аннотаций в WAR

Если мы определим специфичные для веб-приложений фильтры сервлетов в собственном WAR web.xml, тогда порядок выполнения фильтров будет таким же, как порядок, в котором они определены в web.xml,

Но если мы определим эти фильтры с помощью @WebFilter аннотация, каков порядок выполнения фильтров и как мы можем определить порядок выполнения?

6 ответов

Решение

Вы действительно не можете определить порядок выполнения фильтра, используя @WebFilter аннотаций. Однако, чтобы минимизировать web.xml использование, достаточно аннотировать все фильтры только с 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> в 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

Спецификация Servlet 3.0, похоже, не дает подсказки о том, как контейнер должен упорядочивать фильтры, которые были объявлены с помощью аннотаций. Понятно, как насчет того, как упорядочить фильтры через их объявление в файле web.xml.

Быть в безопасности. Используйте фильтры порядка файлов web.xml, которые имеют взаимозависимости. Попробуйте сделать все фильтры независимыми от заказов, чтобы минимизировать необходимость использования файла web.xml.

@WebFilter не имеет элемента для определения порядка выполнения фильтра. Если вам это нужно, вы должны выбрать web.xml.

Если Spring существует в вашем проекте, вы можете использоватьorg.springframework.core.annotation.Orderаннотация над классом. Fe@Order(0),@Order(1)и т. д.

  1. Сделайте фильтр сервлета реализацией интерфейса Spring Ordered.
  2. Объявите 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();
        }
    }

К сожалению, вы должны прибегнуть к немного XML еще.

Проверьте раздел спецификации 8.2 и добавьте нужные биты в ваш web.xml или web-фрагмент.xml, в зависимости от вашей упаковки. Обратите внимание, что это

В файле web.xml вы можете фильтровать и прослушивать по имени:

<absolute-ordering>
  <name>FirstFilter</name>
  <name>NextFilter</name>
</absolute-ordering>

В файле web-фрагмент.xml вы можете фильтровать и прослушивать до или после других, как указано по имени или в общем случае с тегом "другие". Например, чтобы сначала попытаться заказать JAR-файл, используйте в файле web-фрагмент.xml следующее

<order>
  <before>
    <others/>
  </before>
</order>

Обратите внимание, что web-фрагмент.xml заказывает для JAR, а фильтры или прослушиватели в одном и том же JAR упорядочиваются произвольно, если это не указано в приложении web.xml.

Другие вопросы по тегам