[英]Spring filter losing set variables after init function
I'm having a weird problem with a simple spring filter I'm using. 我在使用一个简单的弹簧过滤器时遇到了一个奇怪的问题。 In the init
function I'm setting a variable this.test = "TEST1234"
but for some reason when reaching then doFilter
function this variable is reverted to null again. 在init
函数中,我设置了一个变量this.test = "TEST1234"
但是由于某种原因,当到达doFilter
函数时,该变量再次恢复为null。
My filter: 我的过滤器:
@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: SecurityConfig:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilterBefore(
new TestFilter(),
AbstractPreAuthenticatedProcessingFilter.class
);
}
}
Console output: 控制台输出:
init: TEST: TEST1234
doFilter: TEST: null
初始化: TEST: TEST1234
doFilter: TEST: null
Why is this variable reverted to null? 为什么将此变量恢复为null? Am I missing something? 我想念什么吗? Is it garbage collected? 是垃圾收集吗?
I'm running my application on Java 1.8.0_171
我在Java 1.8.0_171
上运行我的应用程序
Dependencies: 依存关系:
2.1.4.RELEASE
Spring Boot Starter网站: 2.1.4.RELEASE
1.0.10.RELEASE
Spring Security 1.0.10.RELEASE
: 1.0.10.RELEASE
2.2.1.RELEASE
Spring Security oauth2: 2.2.1.RELEASE
2.5
Javax Servlet: 2.5
Solved it thanks to the comment from @dur
. 通过@dur
的评论解决了它。
First I removed the @Component
annotation so my filter doesn't get instantiated twice. 首先,我删除了@Component
批注,以使我的过滤器不会实例化两次。
Filter: 过滤:
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() {}
}
Also I have created the filter instance as a bean
instead of calling newFilter()
directly in the addFilterBefore()
function. 另外,我已经将过滤器实例创建为bean
而不是直接在addFilterBefore()
函数中调用newFilter()
。
SecurityConfig: 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
);
}
}
Console output (now as expected): 控制台输出(现在如预期):
init: TEST: TEST1234
doFilter: TEST: TEST1234
初始化: TEST: TEST1234
doFilter: TEST: TEST1234
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.