我正在尝试使用 spring 配置我的自定义过滤器 AccountVerificationFilter 并收到 NPE,这些是我的配置
我在 web.xml 中配置了 cpFilterCHain,如下
<filter>
<filter-name>cpFilterChain
</filter-name>
<filter-class>org.springframework.security.web.FilterChainProxy
</filter-class>
</filter>
<filter>
<filter-name>cpFilterChain
</filter-name>
<filter-class>org.springframework.security.web.FilterChainProxy
</filter-class>
</filter>
这是我的 applicationCOntext.xml
<bean id="accountVerificationFilter" class="com.dc.apps.cpportal.security.filter.AccountVerificationFilter" />
<bean id="cpFilterChain" class="org.springframework.security.web.FilterChainProxy">
<sec:filter-chain-map path-type="ant">
<sec:filter-chain pattern="/**" filters="
accountVerificationFilter" />
</sec:filter-chain-map>
</bean>
这是我的 AccountVerificationFilter 组件
@Component
public class AccountVerificationFilter implements Filter {
private static final String UPDATE_PASSWORD_URL = "/updatePassword.do";
private static final String DO_ACTION_URL = ".do";
private static final String IS_URL_VERIFIED = "isUrlVerified";
private Long maxSessionTimeToLive = null;
@Autowired
protected DCAuthenticationSuccessHandler successHandler;
@Autowired
protected ApplicationUrlConfig applicationUrlConfig;
@Autowired
protected AuthenticationFilterConfiguration authenticationConfiguration;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
ServletException {
doFilterHttp((HttpServletRequest) request, (HttpServletResponse) response, filterChain);
}
}
我正在使用 Spring Security 3.1.4。 Tomcat 启动正常,但是当我转到我的应用程序时,我看到了这个异常
SEVERE: Servlet.service() for servlet [cpportal] in context with path [/cpportal] threw exception
java.lang.NullPointerException
at org.springframework.security.web.FilterChainProxy.getFilters(FilterChainProxy.java:202)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:176)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.dc.core.common.SetXFrameOptionsFilter.doFilter(SetXFrameOptionsFilter.java:21)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
at com.dc.core.common.FlashRecyclingFilter.doFilterInternal(FlashRecyclingFilter.java:21)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.dc.core.common.StripJSessionIdFilter.doFilter(StripJSessionIdFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
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:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
有人可以帮我解决这个问题吗?
最佳答案
我认为问题在于 web.xml 中的 cpFilterChain 是应用程序服务器创建的重复对象,而不是 spring 容器实例化的原始对象。
尝试使用 delegatingfilterproxy 将过滤器任务委托(delegate)给 Spring bean
<filter>
<filter-name>cpFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>cpFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
关于java - FilterChainProxy 处的 NullPointerException(spring-security-web-3.1.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23665191/