【问题标题】:gorilla/sessions fails to save new session when MaxAge is 0MaxAge 为 0 时,gorilla/sessions 无法保存新会话
【发布时间】:2019-10-15 22:13:55
【问题描述】:

我在玩具应用程序中使用 gorilla/sessions,我想使用 FilesystemStore,但如果我将商店的 MaxAge 选项设置为 0,它会在保存会话时尝试删除会话,但如果会话是新的,它没有 ID:

    sess, err := s.store.Get(r, "session-name")
    if err != nil {
        log.Printf("error getting session %v", err)
        http.Error(w, "session", http.StatusInternalServerError)
        return
    }

    sess.Values["name"] = r.FormValue("name")
    if err = sess.Save(r, w); err != nil {
        log.Printf("error saving session %v", err)
        http.Error(w, "saving", http.StatusInternalServerError)
        return
    }

    http.Redirect(w, r, "/view", http.StatusFound)

我得到的错误是:

2019/10/15 09:22:03 error saving session remove sessions\session_: The system cannot find the file specified.

查看 Gorilla 代码,Gorilla 代码似乎在确定会话是否具有 ID 之前尝试从存储中删除会话。

是我的 Gorilla 有问题,还是我使用它的方式有问题?

不将 MaxAge 设置为 0 时一切正常,但我必须自己管理 cookie。

【问题讨论】:

  • 听起来您使用的文件不存在。但是你没有包含那部分代码。
  • 为什么将最大年龄设置为 0?

标签: go gorilla


【解决方案1】:

如果您检查Save method,您会看到它尝试删除带有MaxAge <= 0 的会话。您实际上标记了需要以这种方式删除的会话。 由于您正在使用s.store.Get(r, "session-name") 创建会话,因此它将使用该商店中的 MaxAge,您应该将其设置为大于 0 的某个值。

设置 MaxAge 的文档说:

可以通过设置 Options.MaxAge 删除单个会话 = -1 表示该会话。

但在保存中你可以看到:

如果会话的 Options.MaxAge

因此,将其设置为 0 与将其设置为 -1 或任何其他负值相同。

【讨论】:

  • 因为它试图删除尚未保存的会话。 MaxAge
  • 不是,它只删除
  • 对 - 这就是我所看到的 - 我将商店的 MaxAge 设置为 0 因为我希望会话 cookie 在用户关闭时过期浏览器。但是,将其设置为 0 会尝试在文件具有 ID 之前将其删除。也许如果有单独的会话到期选项(比如 15 分钟)并设置 cookie 以使其没有到期(所以当浏览器关闭时它将被删除)。
  • 尝试使用 CookieStore 而不是 FilesystemStore(MaxAge = 0)。
  • 将此标记为答案 - 根据 API,它完全正确。唯一剩下的问题是 API 使用 cookie 发送会话 ID,但我无法设置独立于会话过期的 cookie 过期 - 这是 API 的错。 (当然,文档确实警告文件系统存储未完全烘焙)。
猜你喜欢
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2014-03-18
  • 2013-12-23
  • 1970-01-01
  • 2015-10-30
  • 2014-02-15
相关资源
最近更新 更多