Spring函数后Spring过滤器丢失设置变量

问题描述 投票:1回答:1

我正在使用一个简单的弹簧过滤器,这有一个奇怪的问题。在init函数中,我设置了一个变量this.test = "TEST1234",但由于某种原因,当达到doFilter函数时,此变量再次恢复为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() {}
}

SecurityConfig:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

控制台输出:

init:TEST: TEST1234 doFilter:TEST: null

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

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

依赖关系:

  • Spring boot starter web:2.1.4.RELEASE
  • Spring security jwt:1.0.10.RELEASE
  • Spring security oauth2:2.2.1.RELEASE
  • Javax servlet:2.5
java spring spring-security java-8 spring-filter
1个回答
0
投票

由于@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()

SecurityConfig:

@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
                );
    }
}

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

init:TEST: TEST1234 doFilter:TEST: TEST1234

© www.soinside.com 2019 - 2024. All rights reserved.