簡體   English   中英

Spring 3.2 HTTP請求參數_csrf在CSRF過濾器之前變為空

[英]Spring 3.2 HTTP Request parameter _csrf is becoming null before CSRF Filter

我正在使用Spring 3.2.6和Spring Security 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:在請求參數“ _csrf”或標頭“ X-CSRF-TOKEN”上發現無效的CSRF令牌“ null”。 在org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100)在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)在org.springframework.security.web.FilterChainProxy org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125)處的$ VirtualFilterChain.doFilter(FilterChainProxy.java:342)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java) :342),位於org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87),位於org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:342),位於org.springframework。 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)的org.springframework.web.filter.DelegatingFilterProxy.invokeDele的security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)的org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)的gate(DelegatingFilterProxy.java:343) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)的.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java :169)(位於org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472),位於org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168),位於org.apache.catalina.valves。 org.org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)的org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)的ErrorReportValve.invoke(ErrorReportValve.java:98)組織中的.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) .apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)在org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:539)在org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor .run(JIoEndpoint.java:300)在java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知源)在java.lang.Thread.run(未知源) )

這將是一個漫長的過程,但是可以通過保留對HttpServletRequest的引用(例如,將HttpServletRequest實例存儲在會話中)來觸發此行為,這將阻止Tomcat回收ServletRequest對象。

在不回收實例的情況下,永遠不會重置“已解析”標志(指示已解析查詢參數),從而導致Tomcat不處理下一個請求的URL,從而使您沒有任何查詢參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM