servlet ejemplo tomcat servlets tomcat7 servlet-filters

tomcat - ejemplo servlet java netbeans



El orden de ejecuciĆ³n de los filtros de servlets (2)

Además, puede definir el orden en que se aplican los filtros. Esto se puede lograr agregando las siguientes líneas en su web.xml:

<absolute-ordering> <name>encodingFilter</name> <name>SpringFormMethodFilter</name> </absolute-ordering>

Verifique this para obtener más información.

Me encontré con un error en mi aplicación web que me hizo arañar la cabeza (y, finalmente, tirando de mi pelo) durante un tiempo antes de descubrir lo que estaba pasando.

Básicamente, tenía 2 filtros definidos en mi web.xml, y las dos asignaciones así:

<filter-mapping> <filter-name>encodingFilter</filter-name> <servlet-name>SpringMVCDispatcher</servlet-name> </filter-mapping> <filter-mapping> <filter-name>SpringFormMethodFilter</filter-name> <url-pattern>/administration/*</url-pattern> </filter-mapping>

Ambos son filtros Spring MVC. Mi problema fue que los datos del formulario que obtuve no se interpretaron como UTF-8 a pesar del hecho de que se suponía que encodingFilter establecía la codificación de solicitud en UTF-8 antes de que cualquier otra cosa tuviera la oportunidad de leer de ella.

Finalmente me di cuenta de que el filtro de método de formulario se ejecutó ANTES del filtro de codificación, aunque se supone que el orden en que se definen las asignaciones de filtro es el orden en el que están encadenados:

El orden de los filtros en la cadena es el mismo que el orden en que aparecen las asignaciones de filtro en el descriptor de despliegue de la aplicación web.

(de Oracle )

Cuando utilicé el mismo mapeo, es decir, mapeo a un servlet en lugar de un patrón de URL, para ambas asignaciones, el orden se restaura y todo funciona según lo previsto:

<filter-mapping> <filter-name>encodingFilter</filter-name> <servlet-name>SpringMVCDispatcher</servlet-name> </filter-mapping> <filter-mapping> <filter-name>SpringFormMethodFilter</filter-name> <servlet-name>SpringMVCDispatcher</servlet-name> </filter-mapping>

¿Es eso parte de la especificación de Servlet o es una falla de Tomcat? ¿Está documentado en algún lugar, debería enviar un informe de error?

Estoy usando Tomcat 7.0.39 con Java 7.


Cuando el contenedor recibe una solicitud, primero encuentra todas las asignaciones de filtro con un <url-pattern> que coincide con el URI de solicitud. Este se convierte en el primer conjunto de filtros en la cadena de filtros. Luego encuentra todas las asignaciones de filtro con un <servlet-name> que coincide con el URI de solicitud. Este se convierte en el segundo conjunto de filtros en la cadena de filtros. En ambos conjuntos, los filtros se ejecutan en el orden en que se declaran en el DD.

De acuerdo con las specs

El orden que usa el contenedor para construir la cadena de filtros que se aplicará para un URI de solicitud particular es el siguiente:

  1. En primer lugar, las asignaciones de filtro coincidentes <url-pattern> en el mismo orden en que aparecen estos elementos en el descriptor de despliegue.
  2. A continuación, el <servlet-name> coincide con las asignaciones de filtro en el mismo orden en que aparecen estos elementos en el descriptor de despliegue.