java ee - filtros - Cómo definir el orden de ejecución del filtro de servlet usando anotaciones en WAR
filtros java web (3)
De hecho, no puede definir el orden de ejecución del filtro con la anotación @WebFilter
. Sin embargo, para minimizar el uso de web.xml
, es suficiente anotar todos los filtros con solo un filterName
para que no necesite la definición <filter>
, sino solo una definición <filter-mapping>
en el orden deseado.
Por ejemplo,
@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}
@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}
con en web.xml
solo 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 en @WebFilter
, puede hacer eso,
@WebFilter(filterName="filter1", urlPatterns="/url1/*")
public class Filter1 implements Filter {}
@WebFilter(filterName="filter2", urlPatterns="/url2/*")
public class Filter2 implements Filter {}
pero aún debe mantener el <url-pattern>
en 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 ahoga la presencia de <filter-mapping>
sin <filter>
. Consulte también Utilizar Tomcat, @WebFilter no funciona con <filter-mapping> dentro de web.xml
Si definimos filtros de servlets específicos de la aplicación web en el propio web.xml
WAR, el orden de ejecución de los filtros será el mismo que el que se definieron en el web.xml
.
Pero, si definimos esos filtros usando la anotación @WebFilter
, ¿cuál es el orden de ejecución de los filtros y cómo podemos determinar el orden de ejecución?
La especificación de Servlet 3.0 no parece proporcionar una pista sobre cómo un contenedor debe pedir filtros que han sido declarados a través de anotaciones. Sin embargo, está claro cómo hacer pedidos de 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 totalmente independientes para minimizar la necesidad de usar un archivo web.xml.
Lamentablemente debe recurrir a un poco de XML todavía.
Verifique la sección de especificaciones 8.2 y agregue los bits que necesita a su web.xml o web-fragment.xml, dependiendo de su empaque. Tenga en cuenta que estos son
En un web.xml puede filtros y oyentes por nombre:
<absolute-ordering>
<name>FirstFilter</name>
<name>NextFilter</name>
</absolute-ordering>
En un web-fragment.xml puede filtros y oyentes antes o después de otros como se especifica por nombre o genéricamente con la etiqueta "otros". Por ejemplo, para intentar ordenar su JAR primero, use lo siguiente en web-fragment.xml
<order>
<before>
<others/>
</before>
</order>
Tenga en cuenta que los pedidos web-fragment.xml para el JAR, y los filtros o los receptores dentro del mismo JAR se ordenan arbitrariamente, a menos que se especifique en la aplicación web.xml.