有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring会话冲突会话

在spring会话中,我们有两个应用程序使用同一个redis服务器,因此有时会出现ClassNotFoundException无法序列化的情况,因为某个应用程序尝试序列化由不同应用程序创建的会话。但有时两个服务都会出现此错误

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

此外,我们还无法一致性地再现此问题,有时ClassNotFoundException不出现,有时是出现,任何一致性地再现此问题的指南都将不胜感激

我们使用的spring版本是1.3.1。释放也一样


共 (1) 个答案

  1. # 1 楼答案

    redisNamespace配置参数旨在为会话提供特定于应用程序的名称空间,以便支持多个应用程序使用同一个Redis实例存储会话的用例。从^{} reference manual开始:

    redisNamespace - allows configuring an application specific namespace for the sessions. Redis keys and channel ids will start with the prefix of spring:session:<redisNamespace>:.

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

    作为旁注,redisNamespace的语义在Spring会话2.0中发生了变化,因此您现在可以使用这个参数来配置完整的名称空间,而不是像Spring会话1.3那样只配置前缀的最后一部分。从^{} reference manual开始:

    redisNamespace - allows configuring an application specific namespace for the sessions. Redis keys and channel IDs will start with the prefix of <redisNamespace>:.