Как определить порядок выполнения фильтра сервлетов с помощью аннотаций в 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 не работает с
Спецификация Servlet 3.0, похоже, не дает подсказки о том, как контейнер должен упорядочивать фильтры, которые были объявлены с помощью аннотаций. Понятно, как насчет того, как упорядочить фильтры через их объявление в файле web.xml.
Быть в безопасности. Используйте фильтры порядка файлов web.xml, которые имеют взаимозависимости. Попробуйте сделать все фильтры независимыми от заказов, чтобы минимизировать необходимость использования файла web.xml.
@WebFilter не имеет элемента для определения порядка выполнения фильтра. Если вам это нужно, вы должны выбрать web.xml.
Если Spring существует в вашем проекте, вы можете использоватьorg.springframework.core.annotation.Order
аннотация над классом. Fe@Order(0)
,@Order(1)
и т. д.
- Сделайте фильтр сервлета реализацией интерфейса Spring Ordered.
- Объявите 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.