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

167

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

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

siva636
источник

Ответы:

187

Вы действительно не можете определить порядок выполнения фильтра с помощью @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 не работает с <filter-mapping> внутри web.xml

BalusC
источник
5
они могли бы ввести orderатрибут вложенной @WebFilterMappingаннотации. Интересно, не сделал ли это для простоты
Божо
12
@ Божо: Это не будет достаточно конкретным. Что если ваше веб-приложение поставляется со сторонними библиотеками, которые включают в себя фильтр? Трудно сказать его заказ заранее.
BalusC
1
@BalusC: Что-то пошло не так в вашем примере: шаблон url закрыт именем фильтра.
Эндрю Буржуа
3
@ AndrewBourgeois: исправлено. Была ошибка копирования пасты. Жаль, что редактор Markdown не имеет встроенной проверки XML, как в Eclipse;)
BalusC
6
Использование <url-pattern />не работает в JBoss EAP 6.1 - оно переопределяет @WebFilterзначение и вообще не позволяет фильтру работать.
Seanf
12

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

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

vkraemer
источник
4
В моем проекте много фильтров сервлетов, из них сначала должен вызываться только определенный фильтр, а порядок других фильтров не имеет значения. Нужно ли дефилировать все фильтры в web.xml? Или есть какие-нибудь короткие пути?
siva636