服务器重启之间的大猩猩/会话是否持久?

时间:2017-07-19 17:09:59

标签: session go gorilla

我对会话有一般性问题。谈到这个问题,我不是很老练。我试过了:

NewRediStore (gopkg.in/boj/redistore.v1)  
NewCookieStore  
NewFileSystemStore

我的印象是会话可能会在服务器重启之间持续,因此需要一个' store'。当我的golang后端运行时,我能够为多个用户/浏览器设置新会话并检索它们。没有问题。

当我重新启动服务器时,我注意到所有会话访问都会导致session.IsNew == true。 在Redis中,我可以在重新启动后看到所有会话密钥,甚至验证.Get会话导致检索到正确的ID,但IsNew仍然设置。

我觉得直观,这是有道理的,因为内存中必须有一些地图导致IsNew的设置,但我认为如果商店中的cookie密钥有任何命中,{{1不应该设置。我疯了吗?我做错了有什么容易的吗?这是对如何使用会话的根本误解吗? 如果我需要提供代码或其他详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

我会做同样的假设,并浏览源代码,它看起来应该像你描述的那样工作。您可以尝试调试并单步执行它,尤其是您正在使用的商店的New方法(例如FilesystemStore.NewRediStore.New)。如果该方法成功读取cookie并在商店中找到会话,则应根据来源设置IsNew = false

另请注意,仅检查会话ID不是验证此行为的好方法。如果查看源代码,它会从cookie中解析会话ID,然后会尝试在后备存储中查找。如果查找失败,则会话ID将匹配,但IsNew将为true,并且会话中不会有任何值。确保您在会话中设置了一些值并检查该值而不是会话ID。 CookieStore的行为不同,因为它将会话数据存储在cookie本身中。