这个问题有点老了,但是答案总是有用的。
首先,这是会话支持的CSRF令牌的一个已知问题,如docs:CSRF Caveats-
Timeouts中所述。
要解决此问题,请使用一些Javascript来检测即将到来的超时,使用与会话无关的CSRF令牌存储库或创建自定义
AccessDeniedHandler路由。我选择了后者:
配置XML:
<http> <!-- ... --> <access-denied-handler ref="myAccessDeniedHandler"/></http><bean id="myAccessDeniedHandler" > <!-- <constructor-arg ref="myInvalidSessionStrategy" /> --></bean>
MyAccessDeniedHandler:
public class MyAccessDeniedHandler implements AccessDeniedHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException, ServletException { if (exception instanceof MissingCsrfTokenException) { } else { } }}另外,您可以将自定义处理程序定义为
DelegatingAccessDeniedHandler:
<bean id="myAccessDeniedHandler" > <constructor-arg name="handlers"> <map> <entry key="org.springframework.security.web.csrf.MissingCsrfTokenException"> <bean > <constructor-arg name="invalidSessionStrategy" ref="myInvalidSessionStrategy" /> </bean> </entry> </map> </constructor-arg> <constructor-arg name="defaultHandler"> <bean > <property name="errorPage" value="/my_error_page"/> </bean> </constructor-arg></bean>



