Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当注册为Springbean时,过滤器调用两次_Java_Spring_Spring Mvc_Spring Security_Spring Boot - Fatal编程技术网

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做了什么,自动注册的过滤器都被放置在过滤器链的末尾。感谢您的回答,您节省了我的研究时间,我的问题是我将过滤器定义为@组件