我想将@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,它只会被命中一次。是什么原因以及如何解决?
答案 0 :(得分:17)
正如您所观察到的,Spring Boot将自动使用servlet容器注册任何Filter
的bean。一种选择是不将您的过滤器公开为bean,只将其注册到Spring Security。
如果您希望能够将依赖关系自动装入Filter,那么它需要是一个bean。这意味着您需要告诉Spring Boot不要将其注册为过滤器。作为described in the documentation,您使用FilterRegistrationBean
:
@Bean
public FilterRegistrationBean registration(MyFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}