4

我正在尝试使用用户登录构建一个简单的 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
}

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

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

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

有小费吗 ?

4

1 回答 1

4

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

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

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

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

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

于 2014-02-17T11:10:18.630 回答