Filtrar invocar dos veces cuando se registra como Spring Bean
Quiero usarlo @Autowire
con un Filter
. Entonces defino mi filtro de la SecurityConfig
siguiente manera:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.addFilterBefore(getA(), BasicAuthenticationFilter.class);
http.csrf().disable();
}
@Bean
public A getA(){
return new A();
}
Este filtro A
amplía el de Spring.GenericFilterBean
.
Obtengo el siguiente resultado cuando invoco el controlador, que muestra que el filtro se aplica dos veces.
filter A before
filter A before
mycontroller invoke
filter A after
filter A after
Mi observación es que esta invocación adicional se invoca con el contenedor Spring porque si el filtro no se registra como bean, solo recibe accesos una vez. ¿Cuál es el motivo y cómo puedo solucionarlo?
Como ha observado, Spring Boot registrará automáticamente cualquier bean que esté Filter
en el contenedor de servlets. Una opción es no exponer suFilter
como un bean y solo registrarlo en Spring Security.
Si desea poder conectar automáticamente las dependencias a su sistema, Filter
entonces tiene que ser un bean. Eso significa que debe decirle a Spring Boot que no lo registre como archivo Filter
. Como se describe en la documentación , esto se hace usando FilterRegistrationBean
:
@Bean
public FilterRegistrationBean registration(MyFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
Si tiene la versión Spring 6.0.2 o superior y usa OncePerRequestFilter
, shouldNotFilter
funcionará el método de anulación de la siguiente manera.
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
return request.getServletPath().contains("/api/path/which/needs/to/exclude");
}