web-dev-qa-db-fra.com

Comment définir l'ordre d'exécution du filtre de servlet à l'aide d'annotations dans WAR

Si nous définissons des filtres de servlet spécifiques à une application Web dans le web.xml de WAR, l'ordre d'exécution des filtres sera le même que celui dans lequel ils ont été définis dans le web.xml.

Mais, si nous définissons ces filtres à l'aide de l'annotation @WebFilter, quel est l'ordre d'exécution des filtres et comment pouvons-nous déterminer l'ordre d'exécution?

163
siva636

Vous ne pouvez en effet pas définir l'ordre d'exécution du filtre en utilisant l'annotation @WebFilter . Cependant, pour minimiser l'utilisation de _web.xml_, il suffit d'annoter tous les filtres avec uniquement un filterName afin que vous n'ayez pas besoin de la définition de _<filter>_, mais simplement d'une définition de _<filter-mapping>_. dans l'ordre souhaité.

Par exemple,

_@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}
_

avec in _web.xml_ simplement ceci:

_<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 vous souhaitez conserver le modèle d'URL dans _@WebFilter_, vous pouvez simplement le faire de la sorte,

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

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

mais vous devriez toujours conserver le _<url-pattern>_ dans _web.xml_, car il est requis conformément à XSD, bien qu'il puisse être vide:

_<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern />
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern />
</filter-mapping>
_

Quelle que soit l'approche choisie, tout échouera dans Tomcat jusqu'à la version 7.0.28, car il étouffe la présence de _<filter-mapping>_ sans _<filter>_. Voir aussi Avec Tomcat, @WebFilter ne fonctionne pas avec <filter-mapping> dans web.xml

177
BalusC

La spécification Servlet 3.0 ne semble pas fournir d'indication sur la manière dont un conteneur doit ordonner les filtres déclarés via des annotations. Il est cependant clair comment ordonner les filtres via leur déclaration dans le fichier web.xml.

Fais attention. Utilisez les filtres d'ordre du fichier web.xml comportant des interdépendances. Essayez de rendre vos filtres indépendants de la commande afin de minimiser le recours à un fichier web.xml.

11
vkraemer

@WebFilter n'a aucun élément pour définir l'ordre d'exécution du filtre. Si vous en avez besoin, vous devriez opter pour web.xml.

0
luis-br