Как определить порядок выполнения сервлет-фильтра, используя аннотации в WAR
Если мы определяем фильтры сервлетов webapp в собственном WAR web.xml
, тогда порядок выполнения фильтров будет таким же, как порядок, в котором они определены в web.xml
.
Но если мы определяем эти фильтры с помощью аннотации @WebFilter
, каков порядок выполнения фильтров и как мы можем определить порядок выполнения?
Ответы
Ответ 1
Вы действительно не можете определить порядок выполнения фильтра, используя аннотацию @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
Ответ 2
Спецификация Servlet 3.0, похоже, не дает подсказки о том, как контейнер должен заказывать фильтры, которые были объявлены через аннотации. Понятно, как упорядочивать фильтры через их объявление в файле web.xml.
Будьте в безопасности. Используйте фильтры порядка файлов web.xml, которые имеют взаимозависимости. Попробуйте сделать ваши фильтры незаряженными, чтобы свести к минимуму необходимость использования файла web.xml.
Ответ 3
@WebFilter не имеет элемента для определения порядка выполнения фильтра. Если вам это нужно, вы должны выбрать web.xml.
Ответ 4
К сожалению, вы все равно должны прибегать к XML.
Отметьте раздел и добавьте необходимые вам биты в ваш web.xml или web-fragment.xml, в зависимости от вашей упаковки. Обратите внимание:
В web.xml вы можете фильтровать и слушать по имени:
<absolute-ordering>
<name>FirstFilter</name>
<name>NextFilter</name>
</absolute-ordering>
В веб-фрагменте .xml вы можете фильтровать и прослушивать до или после других, как указано по имени или в целом с тегом "others". Например, чтобы сначала попытаться заказать JAR, используйте следующее в web-fragment.xml
<order>
<before>
<others/>
</before>
</order>
Обратите внимание, что заказы web-fragment.xml для JAR и фильтры или прослушиватели в пределах одного JAR произвольно упорядочены, если не указано в приложении web.xml.