Como definir a ordem de execução do filtro de servlet usando anotações no WAR

167

Se definirmos os filtros de servlet específicos do aplicativo da web no próprio WAR web.xml, a ordem de execução dos filtros será a mesma da ordem em que eles são definidos no web.xml.

Mas, se definirmos esses filtros usando @WebFilteranotação, qual é a ordem de execução dos filtros e como podemos determinar a ordem de execução?

siva636
fonte

Respostas:

187

Você realmente não pode definir a ordem de execução do filtro usando a @WebFilteranotação. No entanto, para minimizar o web.xmluso, basta anotar todos os filtros com apenas um filterNamepara que você não precise da <filter>definição, mas apenas <filter-mapping>na ordem desejada.

Por exemplo,

@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}

com web.xmlexatamente isso:

<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>

Se você deseja manter o padrão de URL @WebFilter, basta fazer o seguinte,

@WebFilter(filterName="filter1", urlPatterns="/url1/*")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2", urlPatterns="/url2/*")
public class Filter2 implements Filter {}

mas você ainda deve manter o <url-pattern>em web.xml, porque é exigido como por XSD, embora possa ser vazia:

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern />
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern />
</filter-mapping>

Independentemente da abordagem, tudo isso falhará no Tomcat até a versão 7.0.28, porque ele engasga com a presença de <filter-mapping>sem <filter>. Consulte também Usando o Tomcat, o @WebFilter não funciona com o <filter-mapping> no web.xml

BalusC
fonte
5
eles poderiam ter introduzido um orderatributo de uma @WebFilterMappinganotação aninhada . Pergunto-me se a não fazê-lo pela simplicidade
Bozho
12
@ Ozoz: Isso não seria específico o suficiente. E se o seu aplicativo da web for fornecido com bibliotecas de terceiros que incluem um filtro? É difícil dizer a ordem de antemão.
BalusC
1
@ BalusC: Algo deu errado no seu exemplo: o padrão de URL é fechado com um nome de filtro.
AndrewBourgeois
3
@AndrewBourgeois: Fixed. Foi um erro de copypaste. Pena que editor Markdown não tem incorporado a validação XML como como em Eclipse;)
BalusC
6
O uso <url-pattern />não funciona no JBoss EAP 6.1 - substitui o @WebFiltervalor e impede a execução do filtro.
Seanf 21/10
12

A especificação do Servlet 3.0 não parece fornecer uma dica sobre como um contêiner deve solicitar filtros que foram declarados por meio de anotações. No entanto, é claro como solicitar filtros por meio de sua declaração no arquivo web.xml.

Esteja a salvo. Use os filtros de ordem de arquivo web.xml que têm interdependências. Tente tornar seus filtros todos os pedidos independentes para minimizar a necessidade de usar um arquivo web.xml.

vkraemer
fonte
4
Eu tenho muitos filtros Servlet no meu projeto, deles apenas um filtro específico deve ser chamado primeiro e a ordem de outros filtros não é uma preocupação. Tenho que contaminar todos os filtros no web.xml? Ou existem atalhos?
precisa saber é