Tomcat独特的会话ID

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

3
答案是“不行”(除非扩展管理器)。但是你的Tomcat默认已经生成了唯一的会话ID,对吧?它应该已经这样做了。你遇到了什么问题? - BalusC
我正在将用户登录详细信息捕获到数据库表中,使用会话ID在一个带有唯一约束的列中,并且出现了唯一约束异常。 - yodhevauhe
3个回答

6
我正在将用户登录详细信息存储在数据库表中,其中包括一个带有唯一约束条件的列中的Session Id,并且我遇到了唯一约束异常。
你不应该将Tomcat生成的会话ID作为DB中的唯一约束条件存储。这没有意义。Tomcat的会话ID仅在所有现有活动会话中是唯一的。Servlet规范不禁止在以后的某个时间重新使用已过期会话的ID进行新会话。使用长度固定的32位十六进制字符串作为会话ID,所有可能的ID并不是“无限的”。你不能防止它在某些时候被重新用于不同的客户端。
我不明白为什么您要将Tomcat生成的会话ID存储在DB中的整个生命周期。当它过期时,您应该将其从DB中删除。或者您应该以不同的方式解决您的问题。由于您没有说明此“解决方案”背后的功能要求,因此我无法提供更适合的答案。但是以下是一些提示:
- 反过来做:在DB中插入或选择必要的数据,获取DB生成的ID并将其存储为HttpSession的属性。例如,已登录的用户ID或整个User对象。 - 或者,如果需要扩展会话的默认生命周期(例如,“记住我”选项),则应自己生成UUID(并测试它是否已存在于DB中)并在单独的cookie中使用它。

我正在尝试跟踪用户登录时间,并考虑在注销、会话过期和启动时将sessionid设置为null。现在,我将在会话中存储由数据库生成的id。谢谢。 - yodhevauhe

1

这取决于安全是否是一个问题。在这种情况下,我认为不是,因为显然它仅用于内部数据库存储(与我的情况相同),而不是用于浏览器会话。 - Boris van Schooten

0

只需使用复合主键,如 CONSTRAINT PRIMARY KEY ("SID" , datum);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接