Cómo definir el orden de ejecución del filtro de servlet utilizando anotaciones en WAR

167

Si definimos filtros de servlet específicos de webapp en los propios de WAR web.xml, entonces el orden de ejecución de los filtros será el mismo que el orden en que se definen en el web.xml.

Pero, si definimos esos filtros usando @WebFilteranotaciones, ¿cuál es el orden de ejecución de los filtros y cómo podemos determinar el orden de ejecución?

siva636
fuente

Respuestas:

187

De hecho, no puede definir el orden de ejecución del filtro mediante @WebFilteranotaciones. Sin embargo, para minimizar el web.xmluso, es suficiente anotar todos los filtros con solo una filterNamepara que no necesite la <filter>definición, sino solo una <filter-mapping>definición en el orden deseado.

Por ejemplo,

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

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

con web.xmlsolo esto:

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

Si desea mantener el patrón de URL @WebFilter, entonces puede hacerlo,

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

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

pero igual deberías mantenerlo <url-pattern>adentro web.xml, porque es obligatorio según XSD, aunque puede estar vacío:

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

Independientemente del enfoque, todo esto fallará en Tomcat hasta la versión 7.0.28 porque se ahoga en presencia de <filter-mapping>sin <filter>. Consulte también Uso de Tomcat, @WebFilter no funciona con <filter-mapping> dentro de web.xml

BalusC
fuente
55
podrían haber introducido un orderatributo de una @WebFilterMappinganotación anidada . Me pregunto si no lo hicieron por simplicidad
Bozho
12
@Bozho: Eso no sería lo suficientemente específico. ¿Qué sucede si su aplicación web incluye bibliotecas de terceros que incluyen un filtro? Es difícil decir su orden de antemano.
BalusC
1
@BalusC: Algo salió mal en su ejemplo: el patrón de URL se cierra con un nombre de filtro.
AndrewBourgeois
3
@AndrewBourgeois: Corregido. Fue un error de copia. Lástima que el editor Markdown no tenga una validación XML integrada como en Eclipse;)
BalusC
66
El uso <url-pattern />no funciona en JBoss EAP 6.1: anula el @WebFiltervalor y evita que el filtro se ejecute en absoluto.
seanf
12

La especificación de Servlet 3.0 no parece proporcionar una pista sobre cómo un contenedor debe ordenar los filtros que se han declarado a través de anotaciones. Sin embargo, está claro cómo hacer para ordenar filtros a través de su declaración en el archivo web.xml.

Cuidate. Utilice los filtros de orden de archivos web.xml que tienen interdependencias. Intente hacer que sus filtros sean todos independientes en orden para minimizar la necesidad de usar un archivo web.xml.

vkraemer
fuente
44
Tengo muchos filtros Servlet en mi proyecto, de ellos solo se debe llamar primero un filtro particular y el orden de otros filtros no es una preocupación. ¿Tengo que profanar todos los filtros en web.xml? ¿O hay atajos?
siva636