0

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

Gorilla 的行为与PHP$_SESSION['name']相似还是$_COOKIE['name']与 PHP 相似?

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

4

1 回答 1

6

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

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

我的建议:

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

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

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

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

session.Options.MaxAge = 0您可以通过根据gorilla/sessions docs 的这一部分进行设置来设置“会话 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)
}

希望有帮助。

于 2015-08-12T02:02:05.313 回答