Maison > Java > javaDidacticiel > Pourquoi mon filtre Spring est-il invoqué deux fois et comment puis-je y remédier ?

Pourquoi mon filtre Spring est-il invoqué deux fois et comment puis-je y remédier ?

Mary-Kate Olsen
Libérer: 2024-12-09 03:00:15
original
962 Les gens l'ont consulté

Why is My Spring Filter Being Invoked Twice, and How Can I Fix It?

Filtre enregistré deux fois avec l'annotation Spring Bean

Lors de l'enregistrement d'un filtre en tant que Spring Bean, il est important de prendre en compte le potentiel d'invocations multiples . Dans certains scénarios, le filtre peut être déclenché deux fois, comme observé dans le problème suivant :

Problème :

Un utilisateur définit un filtre, A, qui étend le GenericFilterBean de Spring. . Lorsque ce filtre est enregistré en tant que bean dans la configuration Spring Security, un appel supplémentaire est observé, entraînant le résultat suivant :

filter A before
filter A before
mycontroller invoke
filter A after
filter A after
Copier après la connexion

Requête :

Pourquoi le filtre est-il appelé deux fois et comment ce problème peut-il être résolu ?

Réponse :

L'invocation supplémentaire se produit car Spring Boot enregistre automatiquement tout bean de type Filter auprès du conteneur de servlet. Pour éviter cela, il existe deux options :

Option 1 : Enregistrez le filtre uniquement auprès de Spring Security

Évitez d'exposer le filtre en tant que bean et enregistrez-le uniquement auprès de Spring Security. , comme suit :

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    http.addFilterBefore(new A(), BasicAuthenticationFilter.class);
    http.csrf().disable();
}
Copier après la connexion

Option 2 : Utiliser FilterRegistrationBean avec Annotation

Si le câblage automatique des dépendances dans le filtre est nécessaire, on peut l'enregistrer en tant que bean mais désactiver son enregistrement automatique auprès du conteneur de servlet à l'aide d'un FilterRegistrationBean :

@Bean
public FilterRegistrationBean registration(MyFilter filter) {
    FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<MyFilter>(filter);
    registration.setEnabled(false);
    return registration;
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal