我是Go语言(Golang)的新手,我正在编写一个基于web的应用程序。我喜欢使用会话变量,就像PHP中的那种(从一个页面到下一个页面的变量,对于用户会话是唯一的)。Go里有类似的东西吗?如果没有,我该如何自己去实现它们呢?或者有什么替代方法?
发布于 2016-02-09 20:28:52
这是另一种选择(披露:我是作者):
引用其文档:
这个包提供了一个易于使用、可扩展和安全的会话实现和管理。可以找到软件包文档和godoc.org:
https://godoc.org/github.com/icza/session
这只是一个HTTP会话实现和管理,您可以按原样使用它,也可以与任何现有的Go web工具包和框架一起使用。
概述
包中有3个关键角色:
Session是(超文本传输协议)会话接口。我们可以使用它来存储和检索常量和变量属性。it.Store是一个会话存储接口,它负责存储会话,并使它们在服务器端可以通过它们的ID进行检索。side.Manager是一个会话管理器接口,它负责从(传入的) HTTP请求中获取Session,并将Session添加到HTTP响应中,以让客户端了解会话。Manager有一个后备Store,负责管理服务器端的Session值。这个包的播放器由接口表示,并且为所有这些播放器提供了各种实现。您不受所提供的实现的约束,请随意为任何播放器提供您自己的实现。
用法
用法不能比这更简单了。获取与http.Request关联的当前会话
sess := session.Get(r)
if sess == nil {
// No session (yet)
} else {
// We have a session, use it
}要创建新会话(例如,在成功登录时)并将其添加到http.ResponseWriter (让客户端了解该会话),请执行以下操作:
sess := session.NewSession()
session.Add(sess, w)让我们来看一个更高级的会话创建:让我们提供一个常量属性(在会话的生命周期内)和一个初始变量属性:
sess := session.NewSessionOptions(&session.SessOptions{
CAttrs: map[string]interface{}{"UserName": userName},
Attrs: map[string]interface{}{"Count": 1},
})并访问这些属性并更改"Count"的值
userName := sess.CAttr("UserName")
count := sess.Attr("Count").(int) // Type assertion, you might wanna check if it succeeds
sess.SetAttr("Count", count+1) // Increment count(当然,变量属性也可以在以后使用Session.SetAttr()添加,而不仅仅是在创建会话时添加。)
要删除会话(例如,注销时),请执行以下操作:
session.Remove(sess, w)请查看session demo application,其中显示了所有这些实际操作。
Google App Engine支持
该包提供对Google App Engine (GAE)平台的支持。
文档中没有包含它(由于+build appengine构建限制),但是这里有:gae_memcache_store.go
该实施将会话存储在Memcache中,并将会话保存到数据存储区作为备份,以防数据将从Memcache中删除。此行为是可选的,可以完全禁用数据存储区。您还可以选择是同步(在同一goroutine中)还是异步(在另一个goroutine中)保存到Datastore,从而缩短响应时间。
我们可以使用NewMemcacheStore()和NewMemcacheStoreOptions()函数来创建一个会话存储实现,该实现将会话存储在GAE的内存缓存中。重要的是要注意,由于访问Memcache依赖于绑定到http.Request的Appengine上下文,因此返回的Store只能在请求的生命周期内使用!请注意,当Store关闭时,Store将自动“刷新”从它访问的会话,因此在请求结束时关闭Store是非常重要的;这通常是通过关闭向其传递store的会话管理器来完成的(最好使用defer语句)。
因此,在每个请求处理中,我们必须使用新的Store创建一个新的会话管理器,并且我们可以使用会话管理器来执行与会话相关的任务,如下所示:
ctx := appengine.NewContext(r)
sessmgr := session.NewCookieManager(session.NewMemcacheStore(ctx))
defer sessmgr.Close() // This will ensure changes made to the session are auto-saved
// in Memcache (and optionally in the Datastore).
sess := sessmgr.Get(r) // Get current session
if sess != nil {
// Session exists, do something with it.
ctx.Infof("Count: %v", sess.Attr("Count"))
} else {
// No session yet, let's create one and add it:
sess = session.NewSession()
sess.SetAttr("Count", 1)
sessmgr.Add(sess, w)
}过期的会话不会自动从数据存储区中删除。为了删除过期的会话,该包提供了一个返回http.HandlerFunc的PurgeExpiredSessFromDSFunc()函数。建议将返回的处理程序函数注册到一个路径,然后可以将该路径定义为要定期调用的cron作业,例如每30分钟左右(您可以选择)。由于cron处理程序可能会运行10分钟,因此返回的处理程序将在8分钟停止以安全完成,即使有更多过期的未删除会话也是如此。可以像这样注册:
http.HandleFunc("/demo/purge", session.PurgeExpiredSessFromDSFunc(""))查看GAE会话演示应用程序,其中展示了如何使用它。演示的cron.yaml文件显示了如何定义cron作业来清除过期的会话。
查看GAE session demo application,它展示了如何在实际中使用这一点。
https://stackoverflow.com/questions/10925103
复制相似问题