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。一种选择是不将过滤器公开为 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/43410139/

相关文章:

java - 如何在超时后杀死 Selenium "Click"线程

java - JList 使用对象删除列表

java - 所有 Activity 中都可用的选项菜单

java - Spring MVC 在调用 SpringStoredProcedure.execute() 后是否发出提交

spring - 使用 Spring/MyBatis 理解 EhCache

java - 如何打开和关闭文件编写器附加?

java - 有关使用@PreAuthorize 时抛出 Access Denied 异常的方法的信息

java - 权限代码和名称的 Spring Security 表达式

java - 使用 url 模式过滤映射 servlet **

java - 重定向不适用于 Spring Boot 应用程序中的 Thymeleaf