Pivotal GemFire多会话的春季会议

问题描述 投票:0回答:1

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

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

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

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

java spring gemfire spring-data-gemfire
1个回答
0
投票

确保您已在WebLogic和TomcatEE中部署的所有(Spring Boot)应用程序实例中为Pivotal GemFire“启用”Spring Session。这很简单如下:

@SpringBootApplication
@EnableGemFireHttpSession
class MySpringBootWebApplication {

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

    ...
}

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

例如,如果您显式设置了Region,则使用:

@EnableGemFireHttpSession(regionName = "MySessionRegion")

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

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

此外,请确保所有应用程序都配置为与同一GemFire群集通信。这取决于Spring Session Region用于与GemFire集群通信的Pool。池名称可以使用注释进行配置,如下所示:

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

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

@Configuration类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 Region存储会话状态使用“DEFAULT”池,当没有显式配置/命名池时,它将使用它。对于example

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

随意分享您所拥有的任何示例代码,配置和/或测试,这些代码,配置和/或测试可能会解决您遇到的问题。

© www.soinside.com 2019 - 2024. All rights reserved.