我想@Autowire搭配使用Filter。所以我在SecurityConfig下面定义我的过滤器:
@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。
A
GenericFilterBean
当我调用控制器时,我得到的输出低于输出,它显示了过滤器命中两次。
filter A before filter A before mycontroller invoke filter A after filter A after
我的观察是,这种额外的调用是用Spring容器调用的,因为如果未将filter注册为bean,则它只会被命中一次。原因是什么,我该如何解决?
如您所见,Spring Boot将自动Filter向servlet容器注册任何一个Bean 。一种选择是不将您的过滤器公开为bean,而仅向Spring Security注册。
如果您希望能够将依赖项自动关联到Filter中,则它必须是一个bean。这意味着您需要告诉Spring Boot不要将其注册为过滤器。如文档中所述,您可以使用FilterRegistrationBean:
FilterRegistrationBean
@Bean public FilterRegistrationBean registration(MyFilter filter) { FilterRegistrationBean registration = new FilterRegistrationBean(filter); registration.setEnabled(false); return registration; }