Як визначити порядок виконання фільтра сервлетів за допомогою анотацій у програмі 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.