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.
Configurer une application Web Spring Boot
Certaines des configurations les plus utiles pour une application Spring Boot.
2. Définition des filtres et de l'ordre d'invocation
Commençons par créer deux filtres:
-
TransactionFilter - pour démarrer et valider des transactions
-
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.