【问题标题】:How unique is HttpSession.getId()?HttpSession.getId() 有多独特?
【发布时间】:2011-05-21 15:09:05
【问题描述】:

HttpSession.getId() 返回的值是否保证跨时间唯一——或者仅在所有活动会话中唯一?

换句话说,我可以将它用作会话日志条目(哪个用户登录的时间和时间)的键吗?

如果getId 是特定于实现的(我猜是这样,因为 J2EE 规范对这个问题只字未提),那么它在 Google App Engine 上是如何处理的?

【问题讨论】:

    标签: java google-app-engine session servlets httpsession


    【解决方案1】:

    问题是关于 Google App Engine。 GAE 是基于 Jetty 而不是 Tomcat,所以你不能使用 ManagerBase.createSession(java.lang.String)。会话在 Datastore(或 memcached)中分布和持久化。它通过由 servlet 容器管理的 cookie(称为 JESSSONID)进行跟踪。在 Datastore 中有类型为 _ah_SESSION 的实体,其 id 是会话 id,前缀为“_ahs”。目前 _ah_SESSION 实体不会自动删除。 所以答案是:目前GAE 上的会话 id 在时间上是唯一的

    【讨论】:

      【解决方案2】:

      是的,它依赖于implementation。就像任何接口中的任何方法一样:-)。由程序员来确保 id 是唯一的。

      如果您将ManagerBase.createSession(java.lang.String)UUID 结合使用,则您100% 确定您的ID 将是唯一的。

      【讨论】:

      • 问题是关于 Google App Engine 的。 GAE 基于 Jetty 而不是 Tomcat。在 GAE 中,会话在数据库中分发和持久化,并且在服务器重启后仍然存在。
      【解决方案3】:

      据我所知,只要您没有重新启动网络服务器,会话 ID 是唯一的。因此,在您的网络服务器的生命周期中,会话 ID 是唯一的。

      在 Apache Tomcat 中,您可以查看 ManagerBase.generateSessionId() 以了解如何生成 ID。但请注意,在 Tomcat 中,生成的 ID 仅在同一上下文中是唯一的。

      希望有所帮助

      【讨论】:

      • 问题是关于 Google App Engine 的。 GAE 基于 Jetty 而不是 Tomcat。在 GAE 中,会话在数据库中分发和持久化,并且在服务器重启后仍然存在。
      猜你喜欢
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2011-04-27
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多