2010-12-07 77 views
4

HttpSession.getId()返回的值是否保證在整個時間內保持唯一 - 或者只在所有活動會話中唯一?HttpSession.getId()有多獨特?

換句話說,我可以將它用作會話日誌條目的關鍵字(哪個用戶登錄的時間和時間有多長)?

如果getId是特定於實現的(我猜是這樣,因爲J2EE規範對這個問題沒有提及),它在Google App Engine上的處理方式如何?

回答

3

就我所知,只要您沒有重新啓動網絡服務器,會話ID就是唯一的。因此,會話ID在您的Web服務器的生命週期中隨着時間的推移而不同。

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

希望幫助

+0

問題是關於Google App Engine。 GAE基於Jetty而非Tomcat。在GAE中,會話分佈並保存在數據庫中,並在服務器重新啓動後保留。 – zacheusz 2011-07-11 20:18:22

2

是的,它是依賴於implementation。正如任何接口中的任何方法一樣:-)。程序員要確保id是唯一的。

如果您將ManagerBase.createSession(java.lang.String)UUID組合使用,則100%確定您的ID是唯一的。

+0

問題是關於Google App Engine。 GAE基於Jetty而非Tomcat。在GAE中,會話分佈並保存在數據庫中,並在服務器重新啓動後保留。 – zacheusz 2011-07-11 20:18:42

1

問題是關於Google App Engine。 GAE基於Jetty而非Tomcat,不能使用ManagerBase.createSession(java.lang.String)。會話分佈並保存在Datastore(或memcached)中。它通過由servlet容器管理的cookie(稱爲JSESSONID)進行跟蹤。在數據存儲中,有_ah_SESSION類型的實體,其ID是以「_ahs」爲前綴的會話ID。目前_ah_SESSION實體不會自動刪除。 所以答案是:目前GAE上的會話ID在整個時間段是唯一的