我们正在尝试跨服务器的零售商非粘性会话解决方案。使用的服务器是WebLogic 12.2.1.3和TomcatEE 7.0.5。我们能够看到跨服务器的会话持续存在。
httpServletRequest.getSession()
有时试图从容器而不是GemFire中检索会话。
我们在客户端cookie和服务器日志中看到的会话ID与GemFire中看到的会话ID不同。这是预期的吗?
编辑:在GemFire中创建的会话ID在客户端浏览器上进行base64编码。这将回答上述问题。
确保您已在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。
随意分享您所拥有的任何示例代码,配置和/或测试,这些代码,配置和/或测试可能会解决您遇到的问题。