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
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(); }
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; }
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!