web-dev-qa-db-fra.com

Ordre d'exécution des filtres de servlet

Je suis tombé sur un bug dans mon application Web qui m'a fait me gratter la tête (et finalement me tirer les cheveux) pendant un certain temps avant de découvrir ce qui se passait.

En gros, j'avais 2 filtres définis dans mon web.xml, et les deux mappages comme ça:

<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>

Ce sont tous les deux des filtres Spring MVC. Mon problème était que les données du formulaire que j'avais obtenues n'étaient pas interprétées comme UTF-8 malgré le fait que le codageFilter était censé définir le codage de la demande sur UTF-8 avant que quoi que ce soit d'autre ait la possibilité de le lire.

J'ai finalement remarqué que le filtre de méthode de formulaire a été exécuté AVANT le filtre de codage, bien que l'ordre dans lequel les mappages de filtres soient définis soit censé être l'ordre dans lequel ils sont enchaînés:

L'ordre des filtres dans la chaîne est le même que l'ordre dans lequel les mappages de filtres apparaissent dans le descripteur de déploiement d'application Web.

(de Oracle )

Lorsque j'ai utilisé le même mappage, c'est-à-dire le mappage vers un servlet au lieu d'un modèle d'URL, pour les deux mappages, l'ordre est restauré et tout fonctionne comme prévu:

<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>

Cela fait-il partie de la spécification Servlet ou est-ce un problème de Tomcat? Est-il documenté quelque part, dois-je soumettre un rapport de bogue?

J'utilise Tomcat 7.0.39 avec Java 7.

31
Pierre Henry

Lorsque le conteneur reçoit une demande, il trouve d'abord tous les mappages de filtres avec un <url-pattern> qui correspond à l'URI de la demande. Cela devient le premier ensemble de filtres dans la chaîne de filtres. Ensuite, il trouve tous les mappages de filtres avec un <servlet-name> qui correspond à l'URI de la demande. Cela devient le deuxième ensemble de filtres dans la chaîne de filtres.Dans les deux ensembles, les filtres sont exécutés dans l'ordre dans lequel ils sont déclarés dans le D.D.

Selon le spécifications

L'ordre utilisé par le conteneur pour créer la chaîne de filtres à appliquer pour une URI de demande particulière est le suivant:

  1. Premièrement les <url-pattern> correspondance des mappages de filtres dans le même ordre que ces éléments apparaissent dans le descripteur de déploiement.
  2. Ensuite, le <servlet-name> correspondance des mappages de filtres dans le même ordre que ces éléments apparaissent dans le descripteur de déploiement.
44
NINCOMPOOP