首页 > 解决方案 > 初始化函数后弹簧过滤器丢失设置变量

问题描述

我正在使用的一个简单的弹簧过滤器有一个奇怪的问题。在init函数中,我设置了一个变量this.test = "TEST1234",但由于某种原因,当到达 thendoFilter函数时,该变量再次恢复为 null。

我的过滤器:

@Component
public class TestFilter implements Filter {
    private String test;

    public void init(FilterConfig cfg) {
        this.test = "TEST1234";
        System.out.println("TEST: " + this.test);

    }

    public void doFilter(
        ServletRequest request,
        ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        System.out.println("TEST: " + this.test);
    }

    public void destroy() {}
}

安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .addFilterBefore(
                    new TestFilter(), 
                    AbstractPreAuthenticatedProcessingFilter.class
                );
    }
}

控制台输出:

初始化:TEST: TEST1234 doFilter:TEST: null

为什么这个变量恢复为空?我错过了什么吗?是垃圾收集吗?

我在 Java 上运行我的应用程序1.8.0_171

依赖项:

标签: javaspringspring-securityjava-8spring-filter

解决方案


感谢来自的评论解决了它@dur

首先,我删除了@Component注释,因此我的过滤器不会被实例化两次。

筛选:

public class TestFilter implements Filter {
    private String test;

    public void init(FilterConfig cfg) {
        this.test = "TEST1234";
        System.out.println("TEST: " + this.test);

    }

    public void doFilter(
        ServletRequest request,
        ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        System.out.println("TEST: " + this.test);
    }

    public void destroy() {}
}

我还创建了过滤器实例,bean而不是newFilter()直接在addFilterBefore()函数中调用。

安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public TestFilter testFilter() {
        return new TestFilter();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .addFilterBefore(
                        testFilter(),
                        AbstractPreAuthenticatedProcessingFilter.class
                );
    }
}

控制台输出(现在符合预期):

初始化:TEST: TEST1234doFilter:TEST: TEST1234


推荐阅读