Как определить порядок выполнения сервлет-фильтра, используя аннотации в 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.