Spring MVC SPRING_SECURITY_SAVED_REQUEST导致连续的无效会话

时间:2015-01-28 12:06:59

标签: spring spring-mvc spring-security

我有一个Spring MVC应用程序,我遇到了无效会话的问题。

该应用程序执行所有经过身份验证/绑定到会话的AJAX请求(持有JSESSIONID)

所以这就是发生的事情。假设我在使用会话进行身份验证的应用中。如果我进入Tomcat并使该会话无效,那么下次发出HTTP请求时,Spring会将我转到登录页面。一旦我再次登录,Spring就可以很好地验证我,但是我的一些AJAX请求会不断地收到HTTP 403错误。

如果我进入获取403s的请求的HTTP标头,我注意到它们有2个JSESSIONID,一个是经过身份验证的会话,另一个是持有 此属性的会话:

SPRING_SECURITY_SAVED_REQUEST   DefaultSavedRequest[<OLD URL>]

因此,这些会话不是经过身份验证的会话,因此它们会导致Spring返回403。

问题是这种情况一直存在,直到我杀死浏览器(在一些甚至无法工作的移动设备上,我必须进入设置以清除浏览器缓存)。

有什么建议吗?

这是一个很大的问题,因为当Sessions由于TTL而使自己失效时会发生这种情况,而且我们会遇到被启动的用户,重新登录并永远获得403,直到他们清除缓存。

1 个答案:

答案 0 :(得分:0)

需要注意的一点是,当您登录时,Spring Security会使现有会话失效,并创建一个新会话,复制旧会话的内容。这旨在创建新的会话标识符以避免会话固定攻击。您可以尝试禁用此功能,以查看它是否与您的问题相关。听起来这些是你正在讨论的两个会议。

但是,如果请求中有两个JSESSIONID标头,那么它听起来像是客户端的问题。您应该弄清楚客户端发送两个值的原因。此外,如果您仍然能够读取先前无效会话的内容,则听起来服务器端可能存在Tomcat问题。

同时检查Tomcat是否在登录响应中发送了两个JSESSIONID值。很久以前就出现了一个问题,就是这样做,但你不太可能在运行这么老版本的Tomcat。