在 OpenLiberty 中使用 httpSessionCache 和 HazelCast 在不同应用程序之间共享会话数据

Share sessions data between different apps using httpSessionCache and HazelCast in OpenLiberty

通过将 OpenLiberty sessionCache-1.0 功能与 HazelCast 结合使用,您可以轻松地在 HazelCast 内存集群中保存和共享会话数据,如下所述:https://openliberty.io/guides/sessions.html

然而,在此设置中,会话数据内部存储在名为:com.ibm.ws.session.attr.[app-context-root] & com.ibm.ws.session.meta.[app-context-root] 的映射中,如 here(虽然我没有看到 OpenLiberty 文档清楚地说明这一点)

这可以防止不同的应用程序(具有不同的上下文根)共享会话数据,因为它们正在从不同的命名映射写入和读取会话数据。

有没有办法覆盖此名称,使具有不同上下文根的应用程序能够从同一映射读写以共享会话数据?

我正在查看 OpenLiberty 文档中的 httpSession- and httpSessionCache-properties,但找不到任何支持此类内容的属性。

要在同一个 EAR 中的不同 Web 应用程序之间共享会话,您可以在 ibm-application-ext.xml 中使用共享会话上下文来使所有 Web 应用程序使用相同的会话上下文根。

https://www.ibm.com/docs/en/was-liberty/base?topic=configuration-osgiapplication#application-ext

这是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<application-ext version="1.1" 
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-application-ext_1_1.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://websphere.ibm.com/xml/ns/javaee">
    
    <shared-session-context value="true"/>
</application-ext>

规范禁止在不同应用之间共享会话数据:

HttpSession objects must be scoped at the application (or servlet context) level. [...] the object referenced, including the attributes in that object, must never be shared between contexts by the container.

所以如果你想在不同的应用程序之间共享一些数据,你必须创建单独的缓存,与会话无关。您也可以为此使用 Hazelcast,而不是会话缓存。

例如,如果所有应用都需要共享与给定用户相关的数据,则用户登录可以是缓存存储中的键。