Java 当注册为Springbean时,过滤器调用两次
我想将Java 当注册为Springbean时,过滤器调用两次,java,spring,spring-mvc,spring-security,spring-boot,Java,Spring,Spring Mvc,Spring Security,Spring Boot,我想将@Autowire与过滤器一起使用。因此,我在SecurityConfig中定义了我的过滤器,如下所示: @Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.addFilterBe
@Autowire
与过滤器一起使用。因此,我在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容器调用,因为若过滤器并没有注册为bean,它只会得到一次命中。原因是什么?我如何修复它?正如您所观察到的,Spring Boot将自动向servlet容器注册任何作为过滤器的bean。一种选择是不将过滤器作为bean公开,只向SpringSecurity注册它
如果您希望能够将依赖项自动关联到过滤器中,那么它需要是一个bean。这意味着您需要告诉Spring Boot不要将其注册为过滤器。同样,您可以使用一个过滤器注册Bean
:
@Bean
public FilterRegistrationBean registration(MyFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
一个调用由servlet容器进行,另一个调用由Spring安全性进行Spring安全性没有单独的容器,但它有自己的过滤器链,用于决定是否允许请求。这不是双重注册。通过显式地为禁用的筛选器提供一个FilterRegistrationBean
,可以防止Spring启动创建一个已启用的筛选器。有没有一种方法可以防止Spring在指定筛选器顺序的同时创建重复的筛选器?我们想为同样是bean的过滤器指定setOrder。无论我们对FilterRegistrationBean做了什么,自动注册的过滤器都被放置在过滤器链的末尾。感谢您的回答,您节省了我的研究时间,我的问题是我将过滤器定义为@组件