Hazelcast + spring security +分布式会话=如何使其工作?

时间:2015-07-18 14:21:15

标签: spring spring-security distributed hazelcast

受到http://docs.hazelcast.org/docs/latest/manual/html/websessionreplication.html的启发,我决定尝试在Spring MVC + Security应用程序中使用它。

我遇到的第一个问题是 - Hazelcast抱怨它无法找到sessionRegistry bean。通过将以下bean添加到spring-security context

,我很快解决了这个问题
<bean id="sessionRegistry"
    class="org.springframework.security.core.session.SessionRegistryImpl" />

但是我马上打了下一期,仍然无法解决。 这就是:

  1. 启动tomcat(假设app也会启动)
  2. 登录网站 - 确定
  3. 退出 - 确定( CONCERN :退出正常,JSESSIONIDREMEMBER_ME_TOKEN Cookie已清除,但hazelcast.sessionId Cookie 已清除)
  4. 重启tomcat
  5. 导航至索引页
  6. 错误:无限重定向到invalidSessionStrategy发生
  7. 经过一些调试后,我发现了几个事实:

    • 这是因为在SessionManagementFilter#doFilter内检查request.isRequestedSessionIdValid()会返回false
    • JSESSIONIDhazelcast.sessionId不同(我假设设计)
    • 看起来问题是因为调用request.isRequestedSessionIdValid()request.getSession()之间的不一致 - 看起来如果前者返回false,那么后者假设创建新会话 - 这不会发生

    到目前为止我尝试了什么(并没有帮助):

    • 使用buildin spring安全注销处理程序手动清除hazelcast.sessionId cookie(没有成功,coockie再次显示相同的值)
    • 解决方法https://github.com/hazelcast/hazelcast/issues/3049,关于在注销时发送HttpSessionDestroyedEvent。没有注意到效果
    • 尝试使用JSESSIONID作为hazelcast cookie名称的会话ID(在这种情况下,我只能打开一次ap,所有后续请求都会导致无限重定向到invalid-session

    所以......显然它并不像官方Hazelcast文档中所说的那么简单。任何想法如何使它工作?

1 个答案:

答案 0 :(得分:1)

所以看起来我找到了解决infinite redirect to invalid session问题的方法。我不确定它是否是捷径,或者它是100%正确的方式......

我使用以下代码创建了自定义InvalidSessionStrategyImpl

@Override
public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
    if (request.getSession(false) instanceof HazelcastHttpSession) {
        HazelcastHttpSession hazelCastSession = (HazelcastHttpSession) request.getSession(false);
        hazelCastSession.invalidate();
    } else {
        request.getSession();
    }
    redirectStrategy.sendRedirect(request, response, redirecctTo);
}

P.S。如果你好奇 - 在那之后我遇到了另一个问题:CPU消耗过多。 Hazelcast吃掉100%的CPU。完全不可接受的问题(特别是对于像Jelastic那样按资源使用情况付费的云部署)。