【问题标题】:golang martini session.Set not setting any valuegolang martini session.Set 不设置任何值
【发布时间】:2015-09-09 10:20:34
【问题描述】:

没有太多的上下文,因为它确实是一种应该起作用的情况,但它就是不起作用。

我正在使用 martini 框架。在一个处理程序中,我正在使用这个:

session.Set("deployed", "true")
r.Redirect("/myOtherURL", http.StatusSeeOther)

其中“会话”是传递给处理程序的会话。会话对象。 在加载 myOtherURL 的处理程序中,我正在使用 session.Get 但没有返回任何内容。我打印了所有会话内容,并且“已部署”不存在。

什么可能导致这个问题?我可能会错过什么?如果可以的话,我会提供更多的背景信息,但它真的就这么简单。

【问题讨论】:

  • 您能否发布更多代码:set 和 get 操作的完整处理程序,以及 cookie 存储的设置代码,包括您正在设置的任何选项(安全、HttpOnly)。
  • @elithrar 这很困难,因为我的函数很大。我注意到,当通过 URL 中的路径 /modules 时,会产生第二个 cookie/会话。我可以在谷歌浏览器的开发工具上看到它。我猜这些单独的会话是我的变量不共享的原因。你知道为什么它会产生第二个会话吗?这是以前听说过的吗?关于处理程序/会话,我对此 /modules 路由没有做任何不同的事情,它与其他路由相同,但出于某种随机原因,它会创建一个新会话。
  • 你在设置cookie的路径吗?如果没有,它将默认为当前路径 - 例如/modules。如果另一条路线处于同一级别或以上,则 cookie 将不适用。您需要将 session.Options.Path 设置为涵盖两者的路径 - 简单的选择是将其设置为 /
  • @elithrar 你是救命稻草,嫁给我
  • 可悲的是(对我们俩来说)我被带走了!现在我在为后代/其他 Gophers 使用台式机时,我已将其添加为答案。

标签: session go martini


【解决方案1】:

只是为了在将来扩展我的评论/帮助其他人:

  • 当您设置的 cookie 没有明确的 Path 值时,cookie 将采用当前路径。
  • Cookie 仅针对该路径和以下路径发送 - 而非之上 - 例如

    1. 当您第一次通过session.Set(val, key) 隐式设置时,为/modules 设置了Cookie
    2. Cookie 发送给/modules/modules/all/modules/detail/12
    3. Cookie 发送给/about/

这可以通过显式设置路径来解决:

var store = sessions.NewCookieStore([]byte("secret123"))

func main() {
    store.Options.Path = "/"
    ...
}

请注意,您可能不想为所有路由发送 cookie(/ 会这样做) - 所以使用判断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多