在我的网络应用程序中,我创建了一个自定义过滤器,用于将当前登录详细信息添加到org.slf4j.MDC
。该应用程序使用弹簧启动,弹簧安全性完全使用注释配置。
以下是弹簧配置的相关部分,
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
@Inject
private CustomFilter customFilter;
//
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilter(customFilter);
}
}
上述代码不起作用。我得到了一个例外
Caused by: java.lang.IllegalArgumentException: Can not set com.example.web.filter.CustomFilter field com.example.config.SecurityConfiguration.customFilter to com.sun.proxy.$Proxy202
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) [rt.jar:1.7.0_25]
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) [rt.jar:1.7.0_25]
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) [rt.jar:1.7.0_25]
at java.lang.reflect.Field.set(Field.java:741) [rt.jar:1.7.0_25]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:505) [spring-beans-4.0.7.RELEASE.jar:4.0.7.RELEASE]
... 76 more
但是这个确实有效。
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
//
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilter(new CustomFilter());
}
}
据我所知,建议让spring容器管理初始化,这就是我尝试第一种方法的原因。任何人都可以告诉我为什么依赖注入失败addFilter()
方法?
PS:我也试过了addFilterAfter
方法,但得到了相同的结果。当我的CustomFilter扩展SecurityContextHolderAwareRequestFilter
时,我只使用addFilter()
。