Golang 大猩猩/会话

use*_*143 4 go gorilla

我正在尝试构建一个带有用户登录的简单 Web 应用程序。

我在另一篇文章中找到了这个功能。

func initSession(r *http.Request) *sessions.Session {
    session, _ := store.Get(r, "mBoxStore")
    if session.IsNew {
        session.Options.Domain = "localhost"
        session.Options.MaxAge = 10
        session.Options.HttpOnly = false
        session.Options.Secure = false
        log.Println("Create New Session (cookie)")
    } else {
        log.Println("Use Old Session (old cookie)")
    }
    return session
}
Run Code Online (Sandbox Code Playgroud)

cookie 在 后过期10 seconds,但是当我在例如之后重新加载页面时,1 Minute 它使用旧的(过期的)cookie。

在我的浏览器 (Firefox) 中,我看到具有正确过期日期的 cookie。

我认为它应该使用新的 cookie 创建一个新的会话,或者这是错误的?

有小费吗 ?

eli*_*rar 5

您看到的原因Use Old Session (old cookie)是会话选项在首次创建 cookie 时设置。每次您在 cookie过期 ( )之前访问 cookie时,都不会进行设置,并且默认值将覆盖您在创建会话时设置的值。默认值为86400 * 30(一个月)。isNew == falseOptionsMaxAge

您可以通过以下方式验证这一点:

  1. 清除站点(即本地主机)的所有 cookie
  2. 在浏览器中显示路线
  3. 检查新创建的 cookie 的到期日期 - 您会看到现在+ 10 秒
  4. 等10秒。
  5. 刷新页面 - 您的日志应该确认它是一个新的 cookie。
  6. 现在在cookie过期之前(即10秒内)刷新页面
  7. 您会看到过期时间为现在 + 1 个月(默认)。

这就是为什么我建议在应用程序启动时设置一次会话选项。仅当您出于身份验证安全目的而设置较短的 cookie 生命周期时才会偏离,并且在这些情况下使用不同的会话名称(即_csrf_token过期时间为 4 小时)。

您使用的代码片段也不是很理想,因为它完全忽略了尝试检索会话时遇到的任何错误。如果您的底层会话存储已损坏,和/或用户禁用了 cookie,您可能会遇到错误。

  • 如果不清楚(当答案说“我建议在应用程序启动时设置一次会话选项”时,我一开始并不清楚),商店有一个“.Options”,就像“session”一样。选项`。因此: `var sessionStore =sessions.NewCookieStore(...)` 然后 `sessionStore.Options = &sessions.Options{ MaxAge: ... }` 等等 (2认同)