Spring Pivotal GemFire 多会话会话

Spring Session for Pivotal GemFire Multi-Session

我们正在为零售商尝试跨服务器的非粘性会话解决方案。 使用的服务器是 WebLogic 12.2.1.3 和 TomcatEE 7.0.5。我们能够看到跨服务器持续存在的会话。

httpServletRequest.getSession() 有时会尝试从容器而不是 GemFire 中检索会话。

此外,我们在客户端 cookie 和服务器日志中看到的会话 ID 与在 GemFire 中看到的不同。这是预期的吗?

编辑: 在 GemFire 中创建的会话 ID 在客户端浏览器上进行了 base64 编码。这将回答上述问题。

请确保您在所有 (Spring Boot) 您已经跨 WebLogic 和 TomcatEE 部署的应用程序实例。这很简单,如下所示:

@SpringBootApplication
@EnableGemFireHttpSession
class MySpringBootWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }

    ...
}

@EnableGemFireHttpSession 是关键。还要确保部署在每个 WebLogic 和 TomcatEE 中的应用程序实例在后端 Pivotal GemFire 集群中共享相同的区域,假设有一个 GemFire 集群为 WebLogic 和 TomcatEE 中的应用程序提供服务。

例如,如果您明确设置区域,使用:

@EnableGemFireHttpSession(regionName = "MySessionRegion")

确保所有应用程序实例使用相同的区域名称(即 "MySessionRegion")。或者,从 SSDG 2.0.5.RELEASE 开始,可以使用 Spring Boot 的 application.properties 文件中的 属性 配置区域名称:

spring.session.data.gemfire.session.region.name=MySessionRegion

此外,确保所有应用程序都配置为与同一个 GemFire 集群通信。这取决于 Spring 会话区域用来与 GemFire 集群对话的 Pool。 Pool 名称可以使用注释配置,如下所示:

@EnableGemFireHttpSession(..., poolName = "SessionPool")

然后,您必须为所有应用程序实例配置池以连接到同一个 GemFire 集群,最好使用定位器,如下所示:

@配置 class MyGemFireConfiguration {

@Bean("SessionPool")
PoolFactoryBean sessionPool() {

    PoolFactoryBean sessionPool = new PoolFactoryBean();

    sessionPool.setName("SessionPool");
    sessionPool.setLocators(Arrays.asList(new ConnectionEndpoint("host1", port1),
        new ConnectionEndpoint("host2", port2),
        ...,
        new ConnectionEndpoint("hostN", portN));

    return sessionPool;
}

...

}

或者,您可以配置 "DEFAULT" GemFire 池,假设配置的客户端 PROXY 区域存储会话状态使用 "DEFAULT" 池,当没有池明确时它会 configured/named .对于 example.

最后要注意的是,如果您使用的是 GemFire WAN 拓扑,并且有多个站点,其中每个站点都服务于应用服务器隔离的特定应用程序集合,也许(即 WebLogic 与 TomcatEE)。然后您必须确保您已配置 GemFire WAN 适当地协调您的多个 GemFire 集群。这超出了这个答案的范围,所以我鼓励你看看 this.

随时分享任何示例代码、配置 and/or 测试,它们可能会阐明您遇到的问题。