全局缓存强制存储会话信息。我们有其他选择吗?

时间:2016-09-15 09:46:53

标签: playframework

Play框架具有缓存(https://www.playframework.com/documentation/2.5.x/JavaCache),这是一个全局缓存。

在我们的例子中,当用户登录时。我们需要存储一个值来跟踪特定会话。目前,我们被迫形成具有会话ID的密钥,以便密钥在Play缓存中是唯一的。

这引起了几个问题。

  1. 在全局类中使用静态hashmap而不是在Play缓存中有什么区别?
  2. 我们是否有任何替代方法而不是Play缓存来存储应该与特定会话绑定的变量?
  3. 目前,我们存储在全球地图中,可用于所有登录。

    它很容易受到攻击,因为地图会公开任何用户的所有值。

    在Java Servlet应用程序中,我们使用Thread Local,我们不能在Play中使用它,因为它是异步框架。

    请详细告诉我。

    感谢。

1 个答案:

答案 0 :(得分:1)

正如Thilo建议你可以使用Cookie。

请注意,Play确实具有Session的概念 - 这确实是一个Cookie(因为Play的体系结构是完全无状态的)。

来自docs: -

由于Session只是一个Cookie,它也只是一个HTTP标头,但是Play提供了一个辅助方法来存储会话值:

public Result login() {
    session("connected", "user@gmail.com");
    return ok("Welcome!");
}

同样,您可以从传入会话中删除任何值:

public Result logout() {
    session().remove("connected");
    return ok("Bye");
}

如果数据是敏感的,那么你需要考虑保护它,即。加密它。

如果数据很大,那么你应该考虑缓存。

缓存与您自己的HashMap?

那是一个更大的讨论。如果您的应用程序增长并且您已经扩展,那么您将如何读取/写入/同步多个HashMaps?你不想要一些驱逐政策等等。