2

我正在尝试设置一个大猩猩会话,然后再次检索该值。我正在做以下测试。

//create session and store in http Cookies
session, err := store.Get(req, "session")
if err != nil {
    errCode = http.StatusInternalServerError
    return
}

//save a value
session.Values["user_id"] = userTuple.UserId
err = session.Save(req, w)
if err != nil {
    errCode = http.StatusInternalServerError
    return
}

//try to get the same session that was just created
nr := http.Request{Header: w.Header()}
session, err = store.Get(&nr, "session")
if err != nil {
    errCode = http.StatusInternalServerError
    return
} else if session.IsNew {
    log.Println("New session created instead of old one.")
}

这是一个更大的 HTTP 处理程序的片段。但是相关部分已发布,第二次调用store.Get()不是返回现有会话,而是返回一个全新的会话。因此,当执行此代码所在的处理程序时,日志语句将打印到控制台。

为什么在这种情况下我得到一个新会话而不是我已经创建和保存的会话?

4

3 回答 3

2

我觉得我已经回答了这个问题。您在滥用此 pkg。在幕后,上下文包用于存储请求的状态,通过创建一个新的、不完整的 http.Request,上下文包返回一个没有会话信息的空状态。

查看此代码以了解我在说什么。

于 2014-09-28T03:44:47.717 回答
1

以下代码不起作用,因为实际的季节值保存在写入的 cookie 中ResponseWriter,复制:

nr := http.Request{Header: w.Header()}
session, err = store.Get(&nr, "session")

保存的代码是https://github.com/gorilla/sessions/blob/master/store.go#L101

出于某种奇怪的原因,它会根据请求指针存储季节 ID,请查看https://github.com/gorilla/context/blob/master/context.go#L31

您必须重新加载页面才能访问新的 cookie。

于 2014-09-28T03:35:44.083 回答
0

我认为这与大猩猩/会话没有任何关系,而是与您如何构建该请求结构有关。

当您调用 时session.Save(r, w)w.Header()现在将包含如下地图:

map[string][]string{
  // ...
  "Set-Cookie": []string{/* ... */}
  // ...
}

您应该用Set-Cookie标头替换该标Cookie头 - 否则,gorilla/sessions 不会在请求中看到任何 cookie,并且会假定该请求没有会话 cookie。

但是,是的,就像@OneOfOne 提到的那样,您通常只需调用http.Redirect并让浏览器执行此操作Set-Cookie-Cookie替换您。

于 2015-11-07T23:19:49.067 回答