【问题标题】:Retrieve full JSESSIONID on a Websphere Cluster在 Websphere 集群上检索完整的 JSESSIONID
【发布时间】:2014-09-28 07:07:47
【问题描述】:

在集群 Websphere 环境中,我使用以下代码检索当前 HTTP 请求的JSESSIONID

HttpServletRequest servletRequest = ...;
servletRequest.getSession().getId();

从这段代码中,我得到了标识符,类似于:z84d621pxY1VChlK_0eEgFZ

然后,如果我检查浏览器上的 cookie,我会看到 JSESSIONID 包含上述 ID,但还有其他信息,例如0000z84d621pxY1VChlK_0eEgFZ:18fjt9t1u

我很惊讶HttpServletRequest.getSession().getId() 没有给我正确的 标识符。

请注意,如果我使用 Tomcat 进行测试,我总是得到相同的值。

我应该如何继续获得完整的JSESSIONID 值?

【问题讨论】:

    标签: jakarta-ee websphere cluster-computing jsessionid


    【解决方案1】:

    它为您提供正确的标识符 - 会话标识符。其余部分是内部 WebSphere 相关部分。 WebSphere 会话 cookie 由 3 部分组成:

    • 纪元数
    • 会话 ID
    • 克隆 ID

    Web 容器使用纪元编号(前四位)来确保缓存的会话不会过时。

    会话 ID - 是实际的会话标识符,它允许容器找到用户会话

    克隆 ID - 与 Web 服务器一起安装的 WebSphere 插件使用克隆 ID 将请求转发到保存有关会话亲缘关系的会话数据的服务器。

    为什么需要其他部分?它们不识别会话,并且可能在会话生命周期内发生变化。

    更新
    您可以使用 cookie api 获取完整的会话 ID:

    Cookie cookies[] = request.getCookies(); 
     for(int i = 0; i< cookies.length; i++) {
        out.println(cookies[i].getName() + " " +cookies[i].getValue()+  " <br>" );
    }
    // output:
    JSESSIONID 00002ikOjIY63tLqbF-6OF0QxL8:-1 
    

    【讨论】:

    • 感谢您的解释。 JSESSIONID 通过 JMS 发送到另一个应用程序,该应用程序需要在与浏览器相同的 HTTP 会话中调用 Web 服务器。我以编程方式发送一个 HTTP 请求和一个 JSESSIONID cookie,其中包含我在 Web 应用程序中检索到的内容。如果 JSESSIONID 不是完整的,它将不起作用。
    • 我还没有找到更好的解决方案来从 cookie 中读取 JSESSIONID。感谢您的建议。
    【解决方案2】:

    Websphere 自定义属性中的 NoAdditionalSessionInfo=true。

    将此值设置为“true”以强制删除会话标识符中不需要的信息。在 WebSphere Application Server 基本版中,从不使用 -1 的克隆 ID;因此,克隆 ID 在设置时不包含在基本版本中。此外,缓存 ID 不用于非持久会话;因此,当设置此值时,缓存 ID 不包含在非持久会话中。 参考:https://www.ibm.com/docs/en/was/9.0.5?topic=tracking-session-management-custom-properties#NoAdditionalSessionInfo

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      相关资源
      最近更新 更多