HttpSession.getId()有多独特?

4

HttpSession.getId() 方法返回值在时间上保证是唯一的,还是只在活动会话之间保持唯一性?

换句话说,我能否将其用作会话日志条目的键(记录用户何时登录以及登录多长时间)?

如果 getId 是特定于实现的(我猜它是,因为 J2EE 规范对此问题不予说明),那么 Google App Engine 如何处理它?

3个回答

3
据我所知,只要您没有重新启动Web服务器,会话ID才是唯一的。因此,在Web服务器的生命周期内,会话ID在时间上是唯一的。
在Apache Tomcat中,您可以查看ManagerBase.generateSessionId()以了解如何生成ID。但请注意,在Tomcat中,生成的ID仅在相同的上下文中是唯一的。
希望这有所帮助。

这个问题涉及到Google App Engine。GAE基于Jetty而不是Tomcat。在GAE中,会话是分布式的,并且持久化存储在数据库中,在服务器重启后仍然存在。 - zacheusz

2
是的,这取决于实现。就任何接口中的任何方法而言都是如此 :-)。程序员需要确保ID唯一。
如果您将ManagerBase.createSession(java.lang.String)与UUID结合使用,则可以100%确定您的ID是唯一的。

这个问题涉及到Google App Engine。GAE基于Jetty而不是Tomcat。在GAE中,会话是分布式的,并且持久化存储在数据库中,在服务器重启后仍然存在。 - zacheusz

1

这个问题是关于Google App Engine的。 GAE基于Jetty而不是Tomcat,因此您无法使用ManagerBase.createSession(java.lang.String)。会话在Datastore(或memcached)中分布和持久化。它通过一个名为 JSESSIONID 的 cookie(由servlet容器管理)进行跟踪。在Datastore中有_id_ah_SESSION实体,其id前缀为“_ahs”的会话id。目前_ah_SESSION实体不会自动删除。

因此答案是:当前GAE上的会话ID在时间上是唯一的


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