2012-12-28 157 views
0

我想知道是否有一種「標準」方式來處理基於GAE的web應用中的persitent HTTP會話。讓我解釋我的問題。GAE中的持久http會話(瀏覽器/實例重啓) - Java

如果我只使用this.getThreadLocalRequest()。getSession()來獲取會話,那麼一旦用戶關閉瀏覽器,此會話將自動失效。

如果我使用Cookie(因此會話將持續到cookie過期或用戶擦除其Cookie),我需要一種機制來驗證存儲在cookie中的sessionID實際上屬於有效會話。我想過在一個concurrentHashMap中存儲sessionID,HttpSession的鍵值對,但現在我遇到了這個hashmap只能用於當前實例的問題,因此我可能遇到一致性問題。

我想到的最後一個解決方案是跟蹤數據存儲區中的會話,但每次收到請求時都必須查詢數據存儲區,這似乎相當荒謬。

也許我完全脫離了軌道,並且有一個非常簡單的方法可以實現我正在嘗試做的事情:在瀏覽器重新啓動和多個gae實例中持續存在的Http會話。

謝謝! 羅德里戈。

回答

2

您通常使用Cookie來實現記住我。這個想法是爲經過身份驗證的用戶生成一個隨機且唯一的cookie,將其餘用戶信息存儲在數據庫中,並將cookie發送到客戶端瀏覽器。

現在,當客戶在5天后回來時,會將cookie的第一個請求發送給您的應用程序。此時,如果用戶尚未通過身份驗證,則可以從請求中提取Cookie,在擁有此Cookie的數據庫中查找用戶,並自動對他進行身份驗證,就好像他已發送憑據一樣。

該解決方案不需要修改GAE處理會話的方式。

+0

所以我應該結合使用會話和cookie,首先檢查會話是否可用,如果不是,我應該查找cookie?現在會話僅對servlet權限有效?如果另一個jvm實例被打開會怎麼樣?會不會導致會話不一致?在一個servlet中可用,而在另一個servlet中不可用 –

+1

會話通常是在第一次請求時創建的,並且與用戶通過身份驗證的事實沒有任何關係。它用於存儲多個後續請求的屬性。例如,一旦JSP被執行,你就有一個會話。一旦用戶通過身份驗證,您可以通過在會話中存儲一些標誌或用戶數據來記住它。用戶的會話對於整個webapp是相同的。 GAE使會話持久化,所以另一個JVM將看到第一個會話創建的會話。記住我的cookie只是驗證用戶身份的另一種方式。 –

+0

爲了記錄:如果會話在整個JVM中持久存在,那麼最好的解決方案可能是跟蹤會話並首次放置一個Cookie(並最終更新它),因此當用戶關閉瀏覽器時他不必再次驗證。謝謝! –

相關問題