游戏框架 会话和 Cookie 如何工作?

Play 如何验证 Cookie?

  • 我注意到,重新启动服务器后,即使我没有在数据库中预处理任何会话数据,我仍然处于登录状态。
  • 我还注意到,我可以在服务器上将日期设置为比cookie的到期日期更大,并且我仍然登录了。
  • 我注销了(将 Cookie 保存到文本文件),但浏览器丢失了 Cookie。然后我从文本文件中重新创建了cookie,然后我再次登录。

饼干看起来像这样:

PLAY_SESSION=e6443c88da7xxxxx

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

从文档
丢弃整个会话
有一个特殊操作会丢弃整个会话:

Ok("Bye").withNewSession

答案 1

您没有指定如何对用户进行身份验证,因此我只是猜测,您正在使用简单的示例,即...简单。

它使用用户的 ID 来标识用户,并检查是否已操作已签名的会话 Cookie,因此,如果您使用正确的签名重新创建 Cookie,它仍然有效。

您应该在服务器端(即)上为会话密钥创建一些区域。在 DB 或内存缓存中(这将比 DB 快)。对于每个成功的登录操作,它的密钥应该是随机生成的(并且最好是相当长的),并且还应该包含用于识别用户,到期日期等的数据。接下来,您应该将此随机放在Play的会话中,而不是记录用户的电子邮件地址或其在DB中行的ID,并在注销和/或到期日期之后将其删除。在这种情况下,即使您在注销后会丢失cookie,也无法使用non-esixting正确登录。sess_keysess_key

AFAIR标准内存缓存将在每次重新启动应用程序时被清除,以确保数据库中的所有缓存也将被删除,您可以使用Global对象并在方法中截断表。sess_keysonStart(...)


答案 2

我找到了答案,更仔细地阅读文档并结合不同的部分。

会话没有技术超时。当用户关闭 Web 浏览器时,它将过期。如果您需要特定应用程序的功能超时,只需将时间戳存储到用户会话中,然后根据您的应用程序需要使用它(例如,对于最大会话持续时间,最大不活动持续时间等)。


重要的是要了解会话和闪存数据不是由服务器存储的,而是使用cookie机制添加到每个后续HTTP请求中。这意味着数据大小非常有限(最多 4 KB),并且您只能存储字符串值。


这就是我担心的,如果cookie丢失,任何人都可以在未来登录服务器。

为了确保这一点,我所要做的是添加一个自制的时间戳授权(在cookie中保存时间戳并验证服务器端)


推荐