我想用@Autowire
with a 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
延长了春天的GenericFilterBean
.
当我调用控制器时,我得到以下输出,其中显示过滤器命中两次。
filter A before
filter A before
mycontroller invoke
filter A after
filter A after
我的观察是,这个额外的调用是使用 Spring 容器调用的,因为如果过滤器没有注册为 bean,它只会被命中一次。原因是什么以及如何解决?
正如您所观察到的,Spring Boot 将自动注册任何属于Filter
与 servlet 容器一起。一种选择是不暴露您的Filter
作为一个 bean 并且仅将其注册到 Spring Security。
如果您希望能够将依赖项自动装配到您的Filter
那么它必须是一颗豆子。这意味着您需要告诉 Spring Boot 不要将其注册为Filter
. As 文档中描述 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-disable-registration-of-a-servlet-or-filter,你可以使用FilterRegistrationBean
:
@Bean
public FilterRegistrationBean registration(MyFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)