190 votes

Comment définir l'ordre d'exécution du filtre de servlet en utilisant des annotations dans WAR

Si nous définissons des filtres servlet spécifiques à l'application Web 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 en utilisant l'annotation @WebFilter, quel est l'ordre d'exécution des filtres, et comment pouvons-nous déterminer l'ordre d'exécution?

206voto

BalusC Points 498232

En effet, vous ne pouvez 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 seulement un filterName de sorte que vous n'ayez pas besoin de la définition , mais juste une définition dans l'ordre désiré.

Par exemple,

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

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

avec juste ceci dans web.xml:

    filter1
    /url1/*

    filter2
    /url2/*

Si vous souhaitez conserver le motif d'URL dans @WebFilter, vous pouvez simplement le faire ainsi,

@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 dans web.xml, car il est requis selon XSD, bien qu'il puisse être vide:

    filter1

    filter2

Peu importe l'approche, tout cela échouera dans Tomcat jusqu'à la version 7.0.28 car il s'étouffe en présence de sans . Voir aussi Using Tomcat, @WebFilter doesn't work with inside web.xml

7 votes

Ils auraient pu introduire un attribut order d'une annotation @WebFilterMapping imbriquée. Je me demande s'ils ne l'ont pas fait pour des raisons de simplicité.

13 votes

@Bozho : Ce ne serait pas assez spécifique. Et si votre application Web est livrée avec des bibliothèques tierces qui incluent un filtre ? Il est difficile de connaître son ordre à l'avance.

1 votes

@BalusC : Quelque chose s'est mal passé dans votre exemple : url-pattern est clos avec un nom de filtre.

13voto

vkraemer Points 7749

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

Soyez prudent. Utilisez le fichier web.xml pour ordonner les filtres ayant des interdépendances. Essayez de rendre tous vos filtres indépendants de l'ordre pour minimiser le besoin d'utiliser un fichier web.xml.

4 votes

J'ai de nombreux 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 une préoccupation. Dois-je définir tous les filtres dans le web.xml? Ou existe-t-il des raccourcis?

0voto

Kolegran Points 1

Si Spring existe dans votre projet, vous pourriez utiliser l'annotation org.springframework.core.annotation.Order sur la classe. Par exemple @Order(0), @Order(1), etc.

-3voto

xiaobei1009 Points 1
  1. Faites en sorte que le filtre de servlet implémente l'interface Ordered de Spring.
  2. Déclarez le bean du filtre de servlet manuellement dans la classe de configuration.

    import org.springframework.core.Ordered;
    
    public class MyFilter implements Filter, Ordered {
    
        @Override
        public void init(FilterConfig filterConfig) {
            // faire quelque chose
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            // faire quelque chose
        }
    
        @Override
        public void destroy() {
            // faire quelque chose
        }
    
        @Override
        public int getOrder() {
            return -100;
        }
    }
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ComponentScan
    public class MyAutoConfiguration {
    
        @Bean
        public MyFilter myFilter() {
            return new MyFilter();
        }
    }

-9voto

Jeff Warren Points 303

Malheureusement, vous devez encore recourir un peu à XML.

Consultez la spécification section 8.2 et ajoutez les morceaux dont vous avez besoin à votre web.xml ou web-fragment.xml, en fonction de votre emballage. Notez que ceux-ci sont

Dans un web.xml, vous pouvez des filtres et des auditeurs par nom:

  FirstFilter
  NextFilter

Dans un web-fragment.xml, vous pouvez des filtres et des auditeurs avant ou après d'autres comme spécifié par nom ou de manière générique avec la balise "others". Par exemple, pour essayer d'ordonner votre JAR en premier, utilisez ce qui suit dans le web-fragment.xml

Notez que le web-fragment.xml ordonne pour le JAR, et les filtres ou auditeurs dans le même JAR sont arbitrairement ordonnés, sauf indication contraire dans le web.xml de l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X