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

167

Si nous définissons des filtres de servlet spécifiques aux applications Web dans WAR web.xml, alors l'ordre d'exécution des filtres sera le même que l'ordre dans lequel ils sont définis dans le web.xml.

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

siva636
la source

Réponses:

187

Vous ne pouvez en effet pas définir l'ordre d'exécution du filtre à l'aide de l' @WebFilterannotation. Cependant, pour minimiser l' web.xmlutilisation, il suffit d'annoter tous les filtres avec juste un filterNamepour que vous n'ayez pas besoin de la <filter>définition, mais juste d'une <filter-mapping>définition dans l'ordre souhaité.

Par exemple,

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

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

avec web.xmljuste ça:

<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 @WebFilter, vous pouvez simplement le faire,

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

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

mais vous devriez toujours garder le <url-pattern>in web.xml, car il est requis selon 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, tout cela échouera dans Tomcat jusqu'à la version 7.0.28 car il s'étouffe en présence de <filter-mapping>sans <filter>. Voir aussi Utilisation de Tomcat, @WebFilter ne fonctionne pas avec <filter-mapping> dans web.xml

BalusC
la source
5
ils auraient pu introduire un orderattribut d' @WebFilterMappingannotation imbriquée . Je me demande si le n'a pas fait pour la simplicité
Bozho
12
@Bozho: Ce ne serait pas assez précis. Que faire si votre application Web est livrée avec des bibliothèques tierces qui incluent un filtre? Il est difficile de dire son ordre à l'avance.
BalusC
1
@BalusC: Une erreur s'est produite dans votre exemple: le modèle d'url est fermé avec un nom de filtre.
AndrewBourgeois
3
@AndrewBourgeois: Corrigé. C'était une erreur de copypaste. Dommage que l'éditeur Markdown n'ait pas de validation XML intégrée comme dans Eclipse;)
BalusC
6
L'utilisation <url-pattern />ne fonctionne pas sur JBoss EAP 6.1 - elle remplace la @WebFiltervaleur et empêche le filtre de s'exécuter du tout.
seanf
12

La spécification Servlet 3.0 ne semble pas fournir d'indication sur la façon dont un conteneur doit ordonner les filtres qui ont été déclarés via des annotations. Cependant, il est clair comment commander les filtres via leur déclaration dans le fichier web.xml.

Fais attention. Utilisez les filtres d'ordre des fichiers web.xml qui ont des interdépendances. Essayez de rendre vos filtres indépendants de l'ordre pour minimiser la nécessité d'utiliser un fichier web.xml.

vkraemer
la source
4
J'ai beaucoup de filtres Servlet dans mon projet, parmi eux, seul un filtre particulier doit être appelé en premier et l'ordre des autres filtres n'est pas un problème. Dois-je souiller tous les filtres dans web.xml? Ou y a-t-il des raccourcis?
siva636