2017-07-19 109 views
2

我有一个关于会话的一般问题。当谈到这个问题时,我的经验并不是很丰富。我试过了:gorilla /会话在服务器重启之间持续存在?

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

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

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

我想直觉地说,这是有道理的,因为内存中必须有一些地图导致IsNew的设置,但我认为如果商店中的cookie密钥有任何命中,则不应设置IsNew。我疯了吗?有什么容易的,我做错了吗?这是对如何使用会话的基本误解? 如果我需要包含代码或其他详细信息,请让我知道。

回答

1

我会假设你有同样的想法,浏览源代码,它看起来应该像你所描述的那样工作。您可以尝试调试并逐步完成调试,特别是您正在使用的商店的New方法(例如FilesystemStore.NewRediStore.New)。据该消息来源称,如果该方法成功读取cookie并在商店中找到会话,它应该设置IsNew = false

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

+1

有趣。挖到redistore,我在代码中看到[this](https://github.com/boj/redistore/blob/v1.2/redistore.go#L242),并决定在那里打印一些东西。 'ok == true' **和**'err ==“gob:name未注册接口:”gitlab.com/droneprime/spectre.host/server/internal/handlers.User“”'这看起来很奇怪错误代码中的这一点?这似乎应该在我的代码? – droneprime

+1

我解决了我的问题。当你放入东西时,你不仅需要用'encoding/gob'注册,而且当你尝试访问数据时也要注册。谢谢你鼓励我在图书馆代码中捅捅。我将在未来做到这一点:) – droneprime

相关问题