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


Si definimos filtros de servlet específicos de webapp en el propio web.xml de WAR, entonces el orden de ejecución de los filtros será el mismo que el orden en el que se definen 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?

Author: BalusC, 2011-07-03

3 answers

De hecho, no puede definir el orden de ejecución del filtro utilizando @WebFilter anotación. 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, entonces puede hacer lo siguiente,

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

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

Pero usted debe todavía mantenga el <url-pattern> en web.xml, porque es requerido 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 atraganta con la presencia de <filter-mapping> sin <filter>. Vea también Usando Tomcat, @WebFilter no funciona con dentro de web.xml

 162
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:27

La especificación 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. Está claro cómo pedir filtros a través de su declaración en la web.archivo xml, sin embargo.

Ten cuidado. Usa la web.filtros de orden de archivos xml que tienen interdependencias. Trate de hacer sus filtros todo orden independiente para minimizar la necesidad de utilizar una web.archivo xml.

 8
Author: vkraemer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-03 04:27:27

Lamentablemente debes recurrir a un poco de XML todavía.

Marque la especificación sección 8.2 y agregue los bits que necesita a su web.xml o web-fragment.xml, dependiendo de su embalaje. Tenga en cuenta que estos son

En una web.xml puedes filtrar y escuchar por nombre:

<absolute-ordering>
  <name>FirstFilter</name>
  <name>NextFilter</name>
</absolute-ordering>

En un fragmento de web.xml puede filtrar y escuchar antes o después de otros como se especifica por nombre o genéricamente con la etiqueta" otros". Por ejemplo, para intentar ordenar su TARRO primero, use lo siguiente en el fragmento de la web.xml

<order>
  <before>
    <others/>
  </before>
</order>

Tenga en cuenta que el fragmento web.las órdenes xml para el JAR, y los filtros u oyentes dentro del mismo JAR se ordenan arbitrariamente, a menos que se especifique en la web de la aplicación.XML.

 -6
Author: Jeff Warren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 13:54:48