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

标签 java spring spring-mvc spring-security spring-boot

我想将@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 将自动向 servlet 容器注册任何属于 Filter 的 bean。一种选择是不将您的 Filter 公开为 bean,而仅将其注册到 Spring Security。

如果您希望能够将依赖项 Autowiring 到您的 Filter 中,那么它必须是一个 bean。这意味着您需要告诉 Spring Boot 不要将其注册为 Filter。如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/57430057/

相关文章:

java - eclipse : applet browser debugging: failed to connect to remote VM. 连接被拒绝

java - 断开套接字与服务器的连接

java - Java中的递归方法似乎只是 "goto"方法的第一行,而不是实际进入下一个调用

java - java 1.7 中的无效标志参数

spring - 在 Spring 上实现 REST API 的两种方法

Java FX TranslateTransition 持续时间更改

java - 如何使用 spring jpa 分页获取列中的不同值以及总数

java - Apache Tiles 替代品

java - 存在依赖关系时 Spring No Class Found 异常

java - 必需的列表参数 'state' 不存在错误