一尘不染

注册为Spring bean时过滤器调用两次

spring-boot

我想@Autowire搭配使用Filter。所以我在SecurityConfig下面定义我的过滤器:

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

该过滤器A扩展了Spring的GenericFilterBean

当我调用控制器时,我得到的输出低于输出,它显示了过滤器命中两次。

filter A before
filter A before
mycontroller invoke
filter A after
filter A after

我的观察是,这种额外的调用是用Spring容器调用的,因为如果未将filter注册为bean,则它只会被命中一次。原因是什么,我该如何解决?


阅读 520

收藏
2020-05-30

共1个答案

一尘不染

如您所见,Spring Boot将自动Filter向servlet容器注册任何一个Bean 。一种选择是不将您的过滤器公开为bean,而仅向Spring
Security注册。

如果您希望能够将依赖项自动关联到Filter中,则它必须是一个bean。这意味着您需要告诉Spring
Boot不要将其注册为过滤器。如文档中所述,您可以使用FilterRegistrationBean

@Bean
public FilterRegistrationBean registration(MyFilter filter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(false);
    return registration;
}
2020-05-30