【问题标题】:gorilla/sessions persistent between server restarts?大猩猩/会话在服务器重新启动之间持续存在?
【发布时间】:2017-07-20 01:50:23
【问题描述】:

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

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

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

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

我凭直觉猜测,这是有道理的,因为内存中必须有一些映射导致 IsNew 的设置,但我认为如果存储中的 cookie 键有任何命中,IsNew 不应该被设置。我要疯了吗?我做错了什么容易吗?这是对如何使用会话的根本误解吗? 如果我需要包含代码或其他详细信息,请告诉我。

【问题讨论】:

    标签: session go gorilla


    【解决方案1】:

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

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

    【讨论】:

    • 有趣。深入研究 redisstore,我在代码中看到了this,并决定在那里打印一些东西。 ok == true and err == "gob: name not registered for interface: "gitlab.com/droneprime/spectre.host/server/internal/handlers.User"" 在代码的这一点上似乎是一个奇怪的错误?看起来应该在我的代码中?
    • 我解决了我的问题。不仅在您放入东西时必须注册encoding/gob,而且在您尝试访问数据时也必须注册。感谢您鼓励我戳图书馆代码。我以后会先这样做的:)
    • @droneprime 这解决了我的问题。我的会话在服务器重新启动后过期似乎很奇怪,而且我在一个毫无意义的地方遇到了那个奇怪的 gob 错误。在正确的位置使用编码/gob 注册解决了我的问题
    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 2014-11-24
    • 2019-12-13
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多