Ros*_*las 21 session session-variables go
我是Go语言(Golang)的新手,我正在编写一个基于Web的应用程序.我想使用会话变量,比如PHP中的类型(从一个页面到下一个页面可用的变量,以及用户会话的唯一变量).Go中有类似的东西吗?如果没有,我将如何自己实施它们?或者有哪些替代方法?
这是另一种选择(披露:我是作者):
https://github.com/icza/session
引用其文档:
该软件包提供易于使用,可扩展和安全的会话实施和管理.可以找到包文档和godoc.org:
https://godoc.org/github.com/icza/session
这只是一个HTTP会话实现和管理,您可以按原样使用它,也可以使用任何现有的Go Web工具包和框架.
包中有3个主要参与者:
Session是(HTTP)会话接口.我们可以使用它来存储和检索它的常量和变量属性.Store 是一个会话存储接口,负责存储会话并使它们可以通过服务器端的ID进行检索.Manager是一个会话管理器接口,负责Session从(传入)HTTP请求中获取,并添加Session到HTTP响应以让客户端知道会话.A Manager有一个支持Store,负责管理Session服务器端的值.该包的播放器由接口表示,并且为所有这些播放器提供各种实现.您不受所提供的实现的约束,随意为任何玩家提供您自己的实现.
用法不能比这更简单.要获取与http.Request关联的当前会话:
sess := session.Get(r)
if sess == nil {
// No session (yet)
} else {
// We have a session, use it
}
Run Code Online (Sandbox Code Playgroud)
要创建新会话(例如,在成功登录时)并将其添加到http.ResponseWriter(让客户端了解会话):
sess := session.NewSession()
session.Add(sess, w)
Run Code Online (Sandbox Code Playgroud)
让我们看一个更高级的会话创建:让我们提供一个常量属性(对于会话的生命周期)和一个初始的变量属性:
sess := session.NewSessionOptions(&session.SessOptions{
CAttrs: map[string]interface{}{"UserName": userName},
Attrs: map[string]interface{}{"Count": 1},
})
Run Code Online (Sandbox Code Playgroud)
并访问这些属性并更改值"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
Run Code Online (Sandbox Code Playgroud)
(当然,变量属性也可以在以后添加Session.SetAttr(),而不仅仅是在创建会话时添加.)
要删除会话(例如,注销时):
session.Remove(sess, w)
Run Code Online (Sandbox Code Playgroud)
查看会话演示应用程序,其中显示了所有这些操作.
该软件包为Google App Engine(GAE)平台提供支持.
文档不包含它(由于+build appengine构建约束),但这里是:gae_memcache_store.go
该实现将会话存储在Memcache中,并且还将会话保存到数据存储区作为备份,以防数据从Memcache中删除.此行为是可选的,可以完全禁用数据存储.您还可以选择保存到数据存储区是同步(在同一个goroutine中)还是异步(在另一个goroutine中),从而缩短响应时间.
我们可以使用NewMemcacheStore()和NewMemcacheStoreOptions()函数来创建会话存储实现,该实现在GAE的Memcache中存储会话.需要注意的是,由于访问Memcache依赖于绑定到的Appengine Context http.Request,因此返回的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)
}
Run Code Online (Sandbox Code Playgroud)
过期的会话不会自动从数据存储中删除.要删除过期的会话,该包提供了一个PurgeExpiredSessFromDSFunc()返回一个的函数http.HandlerFunc.建议将返回的处理函数注册到一个路径,然后可以将其定义为定期调用的cron作业,例如每30分钟左右(您的选择).由于cron处理程序最多可能运行10分钟,因此即使有更多过期,未删除的会话,返回的处理程序也将在8分钟后安全地完成.它可以像这样注册:
http.HandleFunc("/demo/purge", session.PurgeExpiredSessFromDSFunc(""))
Run Code Online (Sandbox Code Playgroud)
查看GAE会话演示应用程序,该应用程序显示了如何使用它. 演示的cron.yaml文件显示了如何定义cron作业以清除过期的会话.
查看GAE会话演示应用程序,其中显示了如何使用它.