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?

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


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.