【发布时间】:2015-07-18 14:21:14
【问题描述】:
受到http://docs.hazelcast.org/docs/latest/manual/html/websessionreplication.html 的启发,我决定尝试一下并在我的 Spring MVC + Security 应用程序中使用它。
我遇到的第一个问题是 - Hazelcast 抱怨找不到 sessionRegistry bean。我通过将以下 bean 添加到 spring-security 上下文中很快解决了它
<bean id="sessionRegistry"
class="org.springframework.security.core.session.SessionRegistryImpl" />
但我马上遇到了下一个问题,但仍然无法解决。 这就是发生的事情:
- 启动 tomcat(假设应用程序也将启动)
- 登录网站 - 好的
- 注销 - 正常(关注:已注销,
JSESSIONID和REMEMBER_ME_TOKENcookie 已清除,但hazelcast.sessionIdcookie 未 已清除) - 重启tomcat
- 导航到索引页面
-
错误:发生无限重定向到
invalidSessionStrategy
经过一番调试,我发现了几个事实:
- 这是因为在
SessionManagementFilter#doFilter内部检查request.isRequestedSessionIdValid()返回false -
JSESSIONID和hazelcast.sessionId不同(这是我设计的假设) - 看起来问题是由于调用
request.isRequestedSessionIdValid()和request.getSession()之间的不一致而发生的 - 看起来如果前者返回false,然后后者假设创建新会话 - 这不会发生
到目前为止我尝试了什么(但没有帮助):
- 使用内置 spring 安全注销处理程序手动清除
hazelcast.sessionIdcookie(不成功,coockie 再次以相同的值出现) - 解决方法https://github.com/hazelcast/hazelcast/issues/3049,即在注销时发送
HttpSessionDestroyedEvent。没有发现任何影响 - 尝试使用
JSESSIONID作为 hazelcast cookie 名称的会话 ID(在这种情况下,我只能打开一次 ap,所有后续请求都会导致无限重定向到invalid-session)
所以...显然它并不像 Hazelcast 官方文档中所说的那么简单。任何想法如何使它工作?
【问题讨论】:
标签: spring spring-security distributed hazelcast