【问题标题】:Hazelcast + spring security + distributed sessions = how to make it work?Hazelcast + spring security + 分布式会话 = 如何让它工作?
【发布时间】: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" />

但我马上遇到了下一个问题,但仍然无法解决。 这就是发生的事情:

  1. 启动 tomcat(假设应用程序也将启动)
  2. 登录网站 - 好的
  3. 注销 - 正常(关注:已注销,JSESSIONIDREMEMBER_ME_TOKEN cookie 已清除,但 hazelcast.sessionId cookie 已清除)
  4. 重启tomcat
  5. 导航到索引页面
  6. 错误:发生无限重定向到invalidSessionStrategy

经过一番调试,我发现了几个事实:

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

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

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

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

【问题讨论】:

    标签: spring spring-security distributed hazelcast


    【解决方案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);
    }
    

    附言万一你好奇 - 在那之后我遇到了另一个问题:CPU消耗过多。 Hazelcast 占用 100% 的 CPU。完全不可接受的问题(特别是对于像 Jelastic 这样的云部署,您按资源使用付费)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      相关资源
      最近更新 更多