2011-10-29 9 views
8

Supongamos que tengo en mi siguiente Web.xml¿Cuál será el orden en que se llamarán los filtros?

<filter-mapping> 
    <filter-name>F1</filter-name> 
    <url-pattern>/XYZ/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>F2</filter-name> 
    <url-pattern>/XYZ/abc.do</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>F3</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

¿Cuál será el orden en que serán llamados los filtros si la solicitud se presenta como /XYZ/abc.do.And por qué?

Respuesta

12

En el orden de sus asignaciones se definen en web.xml

Si utilizando anotaciones (@WebFilter) el orden seems to be undefined - usted todavía tiene que declarar las entradas <filter-mapping> en web.xml.

+0

por lo que es F1, F2, F3? ¿Y si en caso de servlet? digamos que tengo 1 patrón que coincida con 2 servlets? –

+1

no importa la cantidad de servlets/uris que coincida. El recurso objetivo actual es solo uno, y para él, los filtros se invocan en el orden de la declaración de mapeo. (Así que sí - F1, F2, F3) – Bozho

+0

sí lo tengo. Pero ahora estoy preguntando sobre un escenario totalmente separado donde el mismo patrón de URL coincide con 2 servlets diferentes s1 y s2. ¿Qué servlet se llamará? Esta pregunta es independiente de filtros –

14

Sección 6.2.4 de la Servlet specification 3.0:

Al procesar un elemento <filter-mapping> usando el estilo <url-pattern>, el contenedor debe determinar si la <url-pattern> coincide con la solicitud URI usando las reglas de asignación de ruta definida en el capítulo 12, “ Asignación de solicitudes a servlets ".

El orden del contenedor utiliza en la construcción de la cadena de filtros que deben aplicarse en una determinada solicitud URI es el siguiente:

  1. primer lugar, los <url-pattern> asignaciones de filtro coincidente en el mismo orden en que estos elementos aparecen en el descriptor de despliegue.

  2. A continuación, las asignaciones de filtro coincidentes <servlet-name> en el mismo orden en que aparecen estos elementos en el descriptor de despliegue.

Si una asignación de filtros contiene tanto <servlet-name> y <url-pattern>, el contenedor debe ampliar la asignación de filtros en múltiples asignaciones de filtro (una para cada <servlet-name> y <url-pattern>), preservando el orden de los elementos <servlet-name> y <url-pattern>.

En resumen: se aplican en el orden en que aparecen en el archivo XML. Resulta interesante si accedes a una URL que está cubierta por los filtros enlazados <url-pattern> y <servlet-name>, porque luego todos los filtros vinculados al patrón URL se aplican antes que todos los filtros vinculados al nombre del servlet. Nunca he estado en esta situación (no he visto ningún filtro enlazado al nombre del servlet), pero creo que podría ser bastante confuso.

Cuestiones relacionadas