2015-09-09 34 views
0

这里没有太多的上下文,因为它确实是某种情况下应该工作,但它没有。golang martini session.Set没有设置任何值

我正在使用马提尼框架。在我使用的一个处理程序中:

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

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

什么可能导致此问题?我可能错过了什么?如果可以的话,我会给出更多的上下文,但它确实如此简单。

+1

你可以发布更多的代码:设置和获取操作的完整处理程序,以及cookie存储的设置代码,包括您设置的任何选项(安全,HttpOnly)。 – elithrar

+0

@elithrar这很难,因为我的功能很大。我注意到,当浏览URL中的路径/模块时,会产生第二个cookie /会话。我可以在谷歌浏览器上的开发工具上看到它。我猜这些单独的会话是我的变量不共享的原因。你知道为什么它会产生第二次会议吗?这听说过吗?对于这个/ modules路由,我不会做任何不同的处理/会话,它和其他的一样,但是由于某些随机的原因,它会创建一个新的会话。 – Conor

+1

您是否设置了Cookie的路径?如果不是,则默认为当前路径 - 例如'/ modules'。如果其他路线处于同一水平或以上,则Cookie不适用。您需要将'session.Options.Path'设置为覆盖两者的路径 - 容易的选择是将其设置为'/'。 – elithrar

回答

1

只是为了在将来对我的意见/帮助他人扩展:

  • 当您设置一个cookie没有明确Path值,该cookie以当前路径上。
  • 只发送该路径和下面的路径 - 不在上面的曲奇 - 例如

    1. /modules设置cookie时,您隐式的通过session.Set(val, key)
    2. 的Cookie设置首次派人/modules/modules/all/modules/detail/12
    3. 曲奇为​​或/

这可以通过固定设置明确的路径:

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

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

要知道,你可能不希望发送的所有路由一个cookie(这是什么/都行) - 所以使用的判断。