【问题标题】:Gorilla session package confusion大猩猩会话包混乱
【发布时间】:2017-05-19 01:25:06
【问题描述】:

来自 PHP 背景,我对 Gorilla 会话包有点困惑。

Gorilla 的行为类似于 $_SESSION['name'] 还是类似于 PHP 中的 $_COOKIE['name']

我正在尝试使用这两种方式为我的 Go Web 应用程序创建用户会话,但我不确定 Gorilla 会话是否是一个很好的包。我希望没有点击登录表单上“记住我”按钮的用户在关闭浏览器后删除他们的会话,而其他所有人都会有一个与他们关联的 cookie。那么 Gorilla 会话是否能够处理这两种情况,还是在这种情况下我应该使用其他东西?

【问题讨论】:

    标签: session go gorilla


    【解决方案1】:

    这完全取决于您使用的存储后端。

    gorilla/sessions 包具有内置的基于 cookie 和文件系统的存储。没有基于内存的存储,大致就是PHP的$_SESSION

    我的建议:

    • 使用内置 cookie 存储,它使用签名的 cookie。它非常适合大多数用途,并且最容易实现。
    • 如果您需要服务器端会话(即在会话中存储较大的值),pick from the available implementations - Redis、BoltDB、mySQL、Postgres 等。

    我对 Redis 支持的存储 (redistore) 有第一手经验,这非常棒。 BoltDB(基于文件的密钥存储)和 Postgres 存储也很可靠,如果您对它们有偏好的话。

    我希望没有点击登录表单上“记住我”按钮的用户在关闭浏览器后删除他们的会话,而其他所有人都会有一个与他们关联的 cookie。那么 Gorilla 会话是否能够处理这两种情况,或者在这种情况下我应该使用其他东西吗?

    请注意,所有实现都需要一个“cookie”——这只是 cookie 是自包含存储,还是仅包含引用后端存储中的行/值的标识符。

    您可以按照this part of the gorilla/sessions docs 设置session.Options.MaxAge = 0 来设置“会话cookie”(即仅持续与选项卡/浏览器会话一样长)。

    例如

    func MyHandler(w http.ResponseWriter, r *http.Request) {
        session, err := store.Get(r, "session-name")
        if err != nil {
            http.Error(w, err.Error(), 500)
            return
        }
    
        // Add your logic to check the r.FormValue for your remember_me checkbox.
    
        // Temporary session
        session.Options.MaxAge = 0
    
        // Set some session values.
        session.Values["user"] = someUser
        // Save it before we write to the response/return from the handler.
        session.Save(r, w)
    }
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 2014-11-24
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2018-06-08
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多