Filtrar invocar dos veces cuando se registra como Spring Bean

Resuelto Harshana asked hace 8 años • 3 respuestas

Quiero usarlo @Autowirecon un Filter. Entonces defino mi filtro de la SecurityConfigsiguiente 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 Aamplí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?

Harshana avatar Sep 04 '16 13:09 Harshana
Aceptado

Como ha observado, Spring Boot registrará automáticamente cualquier bean que esté Filteren 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, Filterentonces 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;
}
Andy Wilkinson avatar Sep 04 '2016 08:09 Andy Wilkinson

Si tiene la versión Spring 6.0.2 o superior y usa OncePerRequestFilter, shouldNotFilterfuncionará 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");
    }
Hardik Patel avatar Dec 01 '2022 13:12 Hardik Patel