Rzeczywiście nie można zdefiniować kolejności wykonywania filtrów za pomocą @WebFilter
adnotacji. Jednak, aby zminimalizować web.xml
użycie, wystarczy dodać adnotacje do wszystkich filtrów za pomocą tylko adnotacji filterName
, aby nie potrzebować <filter>
definicji, a jedynie <filter-mapping>
definicję w żądanej kolejności.
Na przykład,
@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}
@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}
w web.xml
tym tylko:
<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>
Jeśli chcesz zachować wzorzec adresu URL @WebFilter
, możesz po prostu tak zrobić,
@WebFilter(filterName="filter1", urlPatterns="/url1/*")
public class Filter1 implements Filter {}
@WebFilter(filterName="filter2", urlPatterns="/url2/*")
public class Filter2 implements Filter {}
ale trzeba jeszcze utrzymać <url-pattern>
in web.xml
, ponieważ nie jest to wymagane zgodnie z XSD, choć mogą to być puste:
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern />
</filter-mapping>
<filter-mapping>
<filter-name>filter2</filter-name>
<url-pattern />
</filter-mapping>
Niezależnie od podejścia, wszystko to zawiedzie w Tomcat do wersji 7.0.28, ponieważ dusi się obecnością <filter-mapping>
bez <filter>
. Zobacz także Używanie Tomcata, @WebFilter nie działa z <filter-mapping> wewnątrz web.xml
order
atrybut zagnieżdżonej@WebFilterMapping
adnotacji. Zastanawiam się, czy nie zrobili tego dla prostoty