Java Spring 3.2 HTTP请求参数_csrf在csrf筛选器之前变为null

Java Spring 3.2 HTTP请求参数_csrf在csrf筛选器之前变为null,java,spring,jsp,http,csrf,Java,Spring,Jsp,Http,Csrf,我正在使用Spring3.2.6和SpringSecurity 3.2.4,我已经为POST、PUT、PATCH和DELETE方法启用了CSRF过滤器。CSRF过滤器工作正常,但由于CSRF令牌为空,它会间歇性失败,即使它作为隐藏参数存在于JSP中,如下所示。这个奇怪的问题时不时发生,然后消失,一段时间内根本没有发生,然后又开始间歇性地发生 这是JSP中的参数 在调用CSRF筛选器之前,HTTP请求参数似乎被置为空 按以下顺序调用筛选器SecurityContextPersistenceFilt

我正在使用Spring3.2.6和SpringSecurity 3.2.4,我已经为POST、PUT、PATCH和DELETE方法启用了CSRF过滤器。CSRF过滤器工作正常,但由于CSRF令牌为空,它会间歇性失败,即使它作为隐藏参数存在于JSP中,如下所示。这个奇怪的问题时不时发生,然后消失,一段时间内根本没有发生,然后又开始间歇性地发生

这是JSP中的参数

在调用CSRF筛选器之前,HTTP请求参数似乎被置为空

按以下顺序调用筛选器SecurityContextPersistenceFilter、ConcurrentSessionFilter、CsrfFilter等

Tomcat版本是7.0.23

下面是我得到的错误

org.springframework.security.web.csrf.InvalidCsrfTokenException:在请求参数“\u csrf”或标头“X-csrf-Token”上发现无效的csrf令牌“null”。 位于org.springframework.security.web.csrf.CsrfFilter.doFilterInternalCsrfFilter.java:100 位于org.springframework.web.filter.OncePerRequestFilter.doFilterOncePerRequestFilter.java:107 位于org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilterFilterChainProxy.java:342 位于org.springframework.security.web.session.ConcurrentSessionFilter.doFilterConcurrentSessionFilter.java:125 位于org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilterFilterChainProxy.java:342 位于org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilterSecurityContextPersistenceFilter.java:87 位于org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilterFilterChainProxy.java:342 位于org.springframework.security.web.FilterChainProxy.doFilterInternalFilterChainProxy.java:192 位于org.springframework.security.web.FilterChainProxy.doFilterFilterChainProxy.java:160 位于org.springframework.web.filter.DelegatingFilterProxy.invokedelegatingfilterproxy.java:343 位于org.springframework.web.filter.DelegatingFilterProxy.doFilterDelegatingFilterProxy.java:260 位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicationFilterChain.java:243 位于org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilterChain.java:210 位于org.apache.catalina.core.StandardWrapperValve.invokeStandardWrapperValve.java:224 位于org.apache.catalina.core.StandardContextValve.invokeStandardContextValve.java:169 位于org.apache.catalina.authenticator.AuthenticatorBase.invokeAuthenticatorBase.java:472 位于org.apache.catalina.core.StandardHostValve.invokeStandardHostValve.java:168 位于org.apache.catalina.valves.ErrorReportValve.invokeErrorReportValve.java:98 位于org.apache.catalina.valves.AccessLogValve.invokeAccessLogValve.java:928 位于org.apache.catalina.core.StandardEngineValve.InvokeStandardenginievalve.java:118 位于org.apache.catalina.connector.CoyoteAdapter.serviceCoyoteAdapter.java:407 位于org.apache.coyote.http11.AbstractHttp11Processor.processAbstractHttp11Processor.java:987 位于org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.processAbstractProtocol.java:539 位于org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.runJIoEndpoint.java:300 位于java.util.concurrent.ThreadPoolExecutor.runWorkerUnknown源 位于java.util.concurrent.ThreadPoolExecutor$Worker.runUnknown Source
在java.lang.Thread.runUnknown Source上,这将是一个长期的问题,但是可以通过保留对HttpServletRequest的引用来触发此行为,例如,将HttpServletRequest实例存储在会话中,从而防止Tomcat回收ServletRequest对象


在不循环使用实例的情况下,表示已解析查询参数的is parsed标志永远不会重置,导致Tomcat不会在下一个请求中处理URL,从而使您没有任何查询参数。

谢谢您,Dittmer,CSRF标记位于JSP中的隐藏字段中,而不是查询参数。这个标志是否适用于作为输入字段的请求参数?我不是100%确定,您必须咨询tomcat源代码才能确定。然而,这只是可能导致这种行为的一个例子。