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: – 创建一个类SpringAnnotationWebInitializerApplicationContextSpring ,它将具有以下内容

 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配置中创建一个带有nullfilter列表的FilterChainProxy bean,而这个bean将由DelegatingFilterProxy在web.xml中使用。 FilterChainProxy#getFilters尝试迭代null列表,并自然失败并出现NullPointerException

问题的根源在于,您无法将Java配置与传统的XML配置混合在一起。 Java配置创建一个单独的FilterChainProxy bean,它与通过XML配置的bean无关。