Comment définir un filtre de démarrage de printemps?

Comment définir un filtre de démarrage de printemps?

 1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons explorer comment définir des filtres personnalisés et spécifier leur ordre d'appel à l'aide de Spring Boot.

Lectures complémentaires:

Rechercher les filtres de sécurité Spring enregistrés

Découvrez comment rechercher tous les filtres Spring Security enregistrés dans une application.

Read more

Configurer une application Web Spring Boot

Certaines des configurations les plus utiles pour une application Spring Boot.

Read more

2. Définition des filtres et de l'ordre d'invocation

Commençons par créer deux filtres:

  1. TransactionFilter - pour démarrer et valider des transactions

  2. RequestResponseLoggingFilter - pour consigner les demandes et les réponses

Afin de créer un filtre, nous devons simplement implémenter l'interfaceFilter:

@Component
@Order(1)
public class TransactionFilter implements Filter {

    @Override
    public void doFilter
      ServletRequest request,
      ServletResponse response,
      FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        LOG.info(
          "Starting a transaction for req : {}",
          req.getRequestURI());

        chain.doFilter(request, response);
        LOG.info(
          "Committing a transaction for req : {}",
          req.getRequestURI());
    }

    // other methods
}
@Component
@Order(2)
public class RequestResponseLoggingFilter implements Filter {

    @Override
    public void doFilter(
      ServletRequest request,
      ServletResponse response,
      FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        LOG.info(
          "Logging Request  {} : {}", req.getMethod(),
          req.getRequestURI());
        chain.doFilter(request, response);
        LOG.info(
          "Logging Response :{}",
          res.getContentType());
    }

    // other methods
}

Pour que Spring puisse reconnaître un filtre, nous devions le définir comme un bean avec l'annotation@Component.

Et, pour que les filtres se déclenchent dans le bon ordre, nous devions utiliser l'annotation@Order.

2.1. Filtrer avec un modèle d'URL

Dans l'exemple ci-dessus, nos filtres sont enregistrés par défaut pour toutes les URL de notre application. Cependant, nous pouvons parfois souhaiter qu'un filtre ne s'applique qu'à certains modèles d'URL.

Dans ce cas, nous devons supprimer l'annotation@Component de la définition de la classe de filtre etregister the filter using a*FilterRegistrationBean*:

@Bean
public FilterRegistrationBean loggingFilter(){
    FilterRegistrationBean registrationBean
      = new FilterRegistrationBean<>();

    registrationBean.setFilter(new RequestResponseLoggingFilter());
    registrationBean.addUrlPatterns("/users/*");

    return registrationBean;
}

Désormais, le filtre ne s'appliquera qu'aux chemins qui correspondent au modèle/users/*.

Pour définir des modèles d'URL pour le filtre, nous pouvons utiliser les méthodesaddUrlPatterns() ousetUrlPatterns().

3. Un exemple rapide

Créons maintenant un point de terminaison simple et envoyons-lui une requête HTTP:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping()
    public List getAllUsers() {
        // ...
    }
}

Les journaux d'application lorsque vous frappez cette API sont les suivants:

23:54:38 INFO  com.spring.demo.TransactionFilter - Starting Transaction for req :/users
23:54:38 INFO  c.s.d.RequestResponseLoggingFilter - Logging Request  GET : /users
...
23:54:38 INFO  c.s.d.RequestResponseLoggingFilter - Logging Response :application/json;charset=UTF-8
23:54:38 INFO  com.spring.demo.TransactionFilter - Committing Transaction for req :/users

Cela confirme que les filtres sont appelés dans l'ordre souhaité.

4. Conclusion

Dans cet article, nous avons résumé comment définir des filtres personnalisés dans une application Web Spring Boot.

Comme toujours, des extraits de code peuvent être trouvésover on GitHub.