我想将@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
。
当我调用 Controller 时,我得到以下输出,其中显示过滤器命中两次。
filter A before
filter A before
mycontroller invoke
filter A after
filter A after
我的观察是,这个额外的调用是通过 Spring 容器调用的,因为如果过滤器没有注册为 bean,它只会被命中一次。原因是什么?如何解决?
最佳答案
正如您所观察到的,Spring Boot 将自动向 servlet 容器注册任何属于 Filter
的 bean。一种选择是不将您的 Filter
公开为 bean,而仅将其注册到 Spring Security。
如果您希望能够将依赖项 Autowiring 到您的 Filter
中,那么它必须是一个 bean。这意味着您需要告诉 Spring Boot 不要将其注册为 Filter
。如described in the documentation ,您可以使用 FilterRegistrationBean
来做到这一点:
@Bean
public FilterRegistrationBean registration(MyFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
关于java - 注册为 Spring bean 时过滤器调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57430057/