簡體   English   中英

播放框架會話和cookie如何工作?

[英]Play framework how do sessions and cookies work?

游戲如何驗證cookie?

  • 我注意到,在我重新啟動服務器后,我仍然登錄,即使我沒有在數據庫中預先存在任何會話數據。
  • 我還注意到我可以將服務器上的日期設置為大於cookie的exipry日期,但我仍然登錄了。
  • 我注銷了(將cookie保存到文本文件中)並且瀏覽器丟失了cookie。 然后我從文本文件中重新創建了cookie,然后我再次登錄。

cookie看起來像這樣:

PLAY_SESSION = e6443c88da7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-的userid%3A1

// My logout code
def logout() = Action {
  Ok("").withNewSession
}

從文檔中
丟棄整個會話
有特殊操作丟棄整個會話:

Ok("Bye").withNewSession

您沒有指定如何對用戶進行身份驗證,所以我只是猜測,您正在使用簡單的簡單示例。

它使用用戶的id來識別用戶,並檢查是否未操作已簽名的會話cookie,因此如果您將使用適當的簽名重新創建cookie,它仍然有效。

您應該在服務器端為會話密鑰創建一些區域,即。 在DB或內存緩存中(這將比DB快)。 對於每個成功的登錄操作,其密鑰應該是隨機生成的(並且優選地相當長),並且還應該包含用於標識用戶,到期日期等的數據。接下來,您應該將此隨機sess_key放入Play的會話而不是已登錄用戶或id的電子郵件地址他在DB中的行,並且在注銷和/或到期日期之后應該將其刪除。 在這種情況下,即使您在注銷后丟失cookie,也無法使用非esixting sess_key正確登錄。

每次重新啟動應用程序時都會清除AFAIR標准內存緩存,以確保刪除DB中的所有sess_keys ,並且可以使用Global對象並在onStart(...)方法中截斷該表。

我找到了更仔細閱讀文檔並結合不同部分的答案。

會話沒有技術超時。 它在用戶關閉Web瀏覽器時到期。 如果您需要特定應用程序的功能超時,只需將時間戳存儲到用戶會話中,然后根據您的應用程序需要使用它(例如,最長會話持續時間,最長不活動持續時間等)。


重要的是要了解Session和Flash數據不是由服務器存儲,而是使用cookie機制添加到每個后續HTTP請求中。 這意味着數據大小非常有限(最多4 KB),並且您只能存儲字符串值。


所以我擔心如果cookie丟失,任何人都可以登錄服務器以備將來使用。

為確保這一點,我需要做的是添加一個自制的時間戳授權(在cookie中保存時間戳並驗證服務器端)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM