Tomcat Unique SessionId

有没有办法配置(xml)tomcat(6.x)来生成唯一的SessionId。 (不扩展ManagerBase / StandardManager)。

我正在捕获db表中的用户登录详细信息,其中Session Id位于具有唯一约束的列中,并且我获得了唯一约束exception

您不应将Tomcat生成的会话ID存储为DB中的唯一约束。 这毫无意义。 Tomcat的会话ID仅在所有现有活动会话中是唯一的。 Servlet规范不禁止在某个时间点,几个月或几年后为新会话重用过期会话的ID。 使用固定长度的32-charhex字符串作为会话ID,所有可能的ID都不是“无限制”。 您无法阻止它在某个时刻被重用于其他客户端。

我不明白为什么你会在数据库生命周期中存储Tomcat生成的会话ID。 您应该在数据库过期时将其从数据库中删除。 或者你应该以不同的方式解决问题。 由于你没有说明这个“解决方案”背后的function要求,我无法给出更合适的答案。 然而,这里有一些提示:

  • 反之亦然:在DB中插入或选择必要的数据,获取DB生成的ID并将其存储为HttpSession的属性。 例如,登录的用户ID,或仅整个User对象。

  • 或者,如果需要扩展会话的默认生命周期,例如“记住我”选项,那么您应该自己生成一个UUID(并测试它是否在DB中不存在)并在单独的cookie中使用它。

我自己正在研究这个问题,我想提一下,使用UUID可以使用128位(32位hex数字)生成有保证的唯一ID。 它基于UTC时间,并且只要生成不同UUID的usec时间戳不同,就保证它是唯一的。

另见RFC4122: https ://www.ietf.org/rfc/rfc4122.txt

Java有一个用于生成这些ID的标准类:
http://docs.oracle.com/javase/6/docs/api/java/util/UUID.htm

只需使用复合主键,作为CONSTRAINT PRIMARY KEY(“SID”,datum);