我对会话有一般性问题。谈到这个问题,我不是很老练。我试过了:
NewRediStore (gopkg.in/boj/redistore.v1)
NewCookieStore
NewFileSystemStore
我的印象是会话可能会在服务器重启之间持续,因此需要一个' store'。当我的golang后端运行时,我能够为多个用户/浏览器设置新会话并检索它们。没有问题。
当我重新启动服务器时,我注意到所有会话访问都会导致session.IsNew == true
。
在Redis中,我可以在重新启动后看到所有会话密钥,甚至验证.Get
会话导致检索到正确的ID,但IsNew
仍然设置。
我觉得直观,这是有道理的,因为内存中必须有一些地图导致IsNew
的设置,但我认为如果商店中的cookie密钥有任何命中,{{1不应该设置。我疯了吗?我做错了有什么容易的吗?这是对如何使用会话的根本误解吗?
如果我需要提供代码或其他详细信息,请与我们联系。
答案 0 :(得分:1)
我会做同样的假设,并浏览源代码,它看起来应该像你描述的那样工作。您可以尝试调试并单步执行它,尤其是您正在使用的商店的New
方法(例如FilesystemStore.New
或RediStore.New
)。如果该方法成功读取cookie并在商店中找到会话,则应根据来源设置IsNew = false
。
另请注意,仅检查会话ID不是验证此行为的好方法。如果查看源代码,它会从cookie中解析会话ID,然后会尝试在后备存储中查找。如果查找失败,则会话ID将匹配,但IsNew
将为true
,并且会话中不会有任何值。确保您在会话中设置了一些值并检查该值而不是会话ID。 CookieStore
的行为不同,因为它将会话数据存储在cookie本身中。