【问题标题】:spring session collision sessions春季会议碰撞会议
【发布时间】:2018-11-30 01:18:42
【问题描述】:

在春季会话中,我们有两个应用程序使用相同的 redis 服务器,结果有时我们会得到 ClassNotFoundException 无法序列化,因为一个应用程序试图序列化由不同应用程序创建的会话。不过,有时这两个服务都开始出现此错误。

为了缓解此问题,我们已确定使用 redisNamespace。但是,假设我们有 2 项服务并且只能更新一项服务。如果我们将redisNamespace 添加到一个服务中,这两个服务上的会话都不会发生冲突吗?例如服务 A 的命名空间为“test”,而服务 B 具有默认的命名空间“”(服务 B 是否仍会尝试使用服务 A 的会话?),还是我们也需要更改服务 B 的命名空间?

此外,我们还无法一致地重现此问题,有时 ClassNotFoundException 不会出现,有时会出现,非常感谢任何一致地重现此问题的指南。

我们使用的spring版本也是1.3.1.RELEASE。

【问题讨论】:

  • 只是一个小疑问,服务A创建的会话不应该也可供服务B访问,否则如果请求从服务器A发送到服务器B,用户将被注销?跨度>
  • 其实不一定,想想我们想要两个使用同一个redis服务器的独立应用程序。

标签: java spring redis spring-session


【解决方案1】:

redisNamespace 配置参数旨在为会话提供特定于应用程序的命名空间,以支持多个应用程序使用同一个 Redis 实例来存储会话的用例。来自1.3.x reference manual

redisNamespace - 允许为会话配置特定于应用程序的命名空间。 Redis 键和通道 ID 将以 spring:session:<redisNamespace>: 前缀开头。

所以你的问题的答案是肯定的——如果一个应用程序没有配置特定的命名空间,但另一个使用相同 Redis 实例的应用程序配置了,它们将使用不同的命名空间,因此不会发生冲突。

附带说明,redisNamespace 的语义在 Spring Session 2.0 中发生了变化,因此您现在可以使用此参数来配置完整的命名空间,而不是像 Spring Session 1.3 中那样只配置前缀的最后一部分。来自2.0.x reference manual

redisNamespace - 允许为会话配置特定于应用程序的命名空间。 Redis 键和通道 ID 将以 <redisNamespace>: 前缀开头。

【讨论】:

    猜你喜欢
    • 2015-04-11
    • 2011-12-31
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多