Comment définir l'ordre d'exécution du filtre servlet en utilisant les annotations dans la guerre

si nous définissons des filtres de servlet spécifiques à webapp dans le propre web.xml de WAR , 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 de @WebFilter annotation, qu'est-ce que l'ordre d'exécution des filtres, et comment pouvons-nous déterminer l'ordre d'exécution?

151
demandé sur BalusC 2011-07-03 07:38:00

3 réponses

vous ne pouvez en effet pas définir l'ordre d'exécution du filtre en utilisant @WebFilter annotation. Cependant, pour minimiser l'utilisation de web.xml , il suffit d'annoter tous les filtres Avec juste un filterName pour que vous n'ayez pas besoin de la définition <filter> , mais juste une définition <filter-mapping> dans l'ordre désiré.

par exemple,

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

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

avec dans web.xml juste 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 garder le modèle D'URL dans @WebFilter , alors vous pouvez juste faire comme cela,

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

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

mais vous devez quand même conserver le <url-pattern> dans 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 va échouer dans Tomcat jusqu'à la version 7.0.28 car il s'étouffe sur la présence de <filter-mapping> sans <filter> . Voir aussi avec Tomcat, @WebFilter ne fonctionne pas avec < filter-mapping> à l'intérieur du web.xml

162
répondu BalusC 2017-05-23 11:54:27

la spécification Servlet 3.0 ne semble pas fournir d'indication sur la façon dont un conteneur devrait commander des filtres qui ont été déclarés via des annotations. Il est clair que sur la façon de commander des filtres via leur déclaration dans le web.fichier xml.

soyez prudent. Utiliser le web.les filtres d'ordre de fichier xml qui ont des interdépendances. Essayez de rendre vos filtres indépendants de l'ordre pour minimiser le besoin d'utiliser un web.fichier xml.

8
répondu vkraemer 2011-07-03 04:27:27

malheureusement, vous devez recourir à un peu de XML encore.

Vérifier spec section 8.2 et ajouter les éléments dont vous avez besoin pour votre site web.xml ou web-fragment.xml, dépendant de votre packaging. Remarque: ce sont

dans une toile.vous pouvez filtrer et écouter par nom:

<absolute-ordering>
  <name>FirstFilter</name>
  <name>NextFilter</name>
</absolute-ordering>

dans un fragment de toile.xml vous pouvez filtrer et écouteurs avant ou après d'autres comme spécifié par le nom ou de manière générique avec le étiquette" autres". Par exemple, pour essayer de commander votre pot en premier, utilisez ce qui suit dans le fragment web.xml

<order>
  <before>
    <others/>
  </before>
</order>

notez que le fragment de web.les commandes xml pour le JAR, et les filtres ou les écouteurs dans le même JAR sont arbitrairement ordonnés, à moins que spécifié dans le web de l'application.XML.

-6
répondu Jeff Warren 2013-03-07 13:54:48