来自PHP背景我对Gorilla会话包有点混淆。
Gorilla的行为与$_SESSION['name']
类似,还是与PHP的$_COOKIE['name']
行为类似?
我尝试使用这两种方式为我的Go网络应用程序创建用户会话,但我不确定Gorilla会话是否是一个很好的软件包。我希望那些没有点击过"记住我的用户"登录表单上的按钮在关闭浏览器后会删除其会话,而其他所有人都将拥有与之关联的cookie。那么Gorilla会话能够处理这两种情况,还是我应该在这种情况下使用其他东西?
答案 0 :(得分:5)
这完全取决于您使用的存储后端。
gorilla/sessions包有内置cookie&基于文件系统的商店。没有基于内存的商店,这大致与PHP的$_SESSION
相同。
我的建议:
我有Redis支持商店(redistore)的第一手经验,这很棒。如果您对这些商店有偏好,BoltDB(基于文件的密钥库)和Postgres商店也是可靠的。
我希望没有点击登录表单上的“记住我”按钮的用户在关闭浏览器后删除会话,而其他人都会有与之关联的cookie。那么Gorilla会话能够处理这两种情况,还是我应该在这种情况下使用其他东西?
请注意,所有实现都需要一个“cookie” - 它只是cookie是自包含存储,还是只包含一个引用后端存储中的行/值的标识符。
您可以按照this part of the gorilla/sessions docs设置session.Options.MaxAge = 0
来设置“会话Cookie”(即,仅与标签/浏览器会话相同)。
e.g。
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)
}
希望有所帮助。