Как определить порядок выполнения фильтра сервлетов с помощью аннотаций в WAR - PullRequest
162 голосов
/ 03 июля 2011

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

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

Ответы [ 3 ]

177 голосов
/ 03 июля 2011

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

11 голосов
/ 03 июля 2011

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

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

0 голосов
/ 09 декабря 2018

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

...