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

Har*_*ana 8 java spring spring-mvc spring-security 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();
    }
Run Code Online (Sandbox Code Playgroud)

这个过滤器A扩展了Spring的GenericFilterBean.

当我调用控制器时,我得到低于输出,这显示过滤器命中两次.

filter A before
filter A before
mycontroller invoke
filter A after
filter A after
Run Code Online (Sandbox Code Playgroud)

我的观察是,这个额外的调用使用Spring容器调用,因为如果filter没有注册为bean,它只会被命中一次.是什么原因,我该如何解决?

And*_*son 20

正如您所观察到的,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;
}
Run Code Online (Sandbox Code Playgroud)

  • 一个调用是由servlet容器进行的,另一个是由Spring Security进行的 (4认同)