gpt4 book ai didi

java - 过滤器在注册为 Spring bean 时调用两次

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:37 24 4
gpt4 key购买 nike

我想将 @AutowireFilter 一起使用。所以我在 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

当我调用 Controller 时,我得到以下输出,这表明过滤器命中了两次。

filter A before
filter A before
mycontroller invoke
filter A after
filter A after

我的观察是,这个额外的调用调用了 Spring 容器,因为如果过滤器没有注册为 bean,它只会被命中一次。是什么原因,我该如何解决?

最佳答案

正如您所观察到的,Spring Boot 会自动将任何作为 Filter 的 bean 注册到 servlet 容器中。一种选择是不将您的过滤器作为 bean 公开,并且只将其注册到 Spring Security。

如果您希望能够将依赖项 Autowiring 到您的过滤器中,那么它需要是一个 bean。这意味着您需要告诉 Spring Boot 不要将其注册为过滤器。作为described in the documentation ,您使用 FilterRegistrationBean 执行此操作:

@Bean
public FilterRegistrationBean registration(MyFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}

关于java - 过滤器在注册为 Spring bean 时调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39314176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com