org.springframework.security.web.FilterChainProxy.getFilters中的NullPointerException
我试图使用spring-security,并得到此错误。
java.lang.NullPointerException at org.springframework.security.web.FilterChainProxy.getFilters(FilterChainProxy.java:223) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:196) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)
我在web.xml中包含filter
org.springframework.web.context.ContextLoaderListener encoding-filter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encoding-filter /* springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /* index.jsp Spring MVC Application contextConfigLocation classpath:applicationContext.xml mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 0 mvc-dispatcher /
并在applicationContext文件中为此filter创建一个bean:
在我在applicationContext文件中注册这个bean之前我有一个错误no bean named 'springSecurityFilterChain' is defined
我不使用spring-security.xml进行配置,并在SecurityConfig类中配置安全性。
public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsServiceImpl userDetailsService; @Autowired public void registerGlobalAuthentication(AuthenticationManagerBuilder auth) throws Exception { auth .userDetailsService(userDetailsService); } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf() .disable() .authorizeRequests() .antMatchers("/resources/**", "/**").permitAll() .anyRequest().permitAll() .and(); http.formLogin() .loginPage("/login") .loginProcessingUrl("/j_spring_security_check") .failureUrl("/login?error") .usernameParameter("j_username") .passwordParameter("j_password") .permitAll(); http.logout() .permitAll() .logoutUrl("/logout") .logoutSuccessUrl("/login?logout") .invalidateHttpSession(true); }
}
我认为配置spring-security文件存在一些问题,但我无法理解有什么问题。
我已经弄清楚这里发生了什么,但我认为你最好只坚持使用Java Config或XML配置,而不是在集成Spring MVC和Security时混合和匹配它们。
在XML Configuration中,springSecurityFilterChain由spring-security.xml中的http
命名空间创建。 请参考这里 。 由于您已切换到java配置,因此没有创建springSecurityFilterChain,这正是应用程序所抱怨的。
要创建springSecurityFilterChain,您需要执行以下两个步骤。
步骤1
从web.xml中删除以下内容
springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /*
第2步
创建一个AbstractSecurityWebApplicationInitializer
,它将为您创建springsecurityfilterchain。
public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer { }
现在, AbstractSecurityWebApplicationInitializer
文档说, 当与AbstractSecurityWebApplicationInitializer()一起使用时,除了AbstractContextLoaderInitializer的子类之外,通常还使用此类。
所以现在你必须自己创建AbstractContextLoaderInitializer。 为此我做了2次更改
第1步: – 从web.xml中删除以下内容
org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/applicationContext.xml
步骤2: – 创建一个类SpringAnnotationWebInitializer
和ApplicationContextSpring
,它将具有以下内容
public class SpringAnnotationWebInitializer extends AbstractContextLoaderInitializer { @Override protected WebApplicationContext createRootApplicationContext() { AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); applicationContext.register(ApplicationContextSpring.class); return applicationContext; } }
和ApplicationContextSpring
将是
@Configuration @ImportResource("classpath:applicationContext.xml") @Import(SecurityConfig.class) public class ApplicationContextSpring { }
就像我说的,你更好地创建java或xml配置。
您正在XML配置中创建一个带有null
filter列表的FilterChainProxy
bean,而这个bean将由DelegatingFilterProxy
在web.xml中使用。 FilterChainProxy#getFilters
尝试迭代null
列表,并自然失败并出现NullPointerException
。
问题的根源在于,您无法将Java配置与传统的XML配置混合在一起。 Java配置创建一个单独的FilterChainProxy
bean,它与通过XML配置的bean无关。