Як визначити порядок виконання фільтра сервлетів за допомогою анотацій у програмі WAR


167

Якщо ми визначимо конкретні серветлеві фільтри webapp у власних програмах WAR web.xml, то порядок виконання фільтрів буде таким самим, як і порядок, у якому вони визначені у web.xml.

Але якщо ми визначимо ці фільтри за допомогою @WebFilterанотації, то який порядок виконання фільтрів і як можна визначити порядок виконання?

Відповіді:


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


5
вони могли ввести orderатрибут вкладеної @WebFilterMappingанотації. Цікаво, чи не зробили це для простоти
Божо

12
@Bozho: Це було б недостатньо конкретно. Що робити, якщо ваш веб-сервер постачається з сторонніми бібліотеками, до яких входить фільтр? Важко заздалегідь сказати його наказ.
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.


4
У моєму проекті є багато фільтрів сервлетів, з них лише певний фільтр повинен бути названий першим, і порядок інших фільтрів не викликає особливих проблем. Чи потрібно дефілювати всі фільтри в web.xml? Або є якісь скорочення?
siva636
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.