Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session Go会话变量?_Session_Go_Session Variables - Fatal编程技术网

Session Go会话变量?

Session Go会话变量?,session,go,session-variables,Session,Go,Session Variables,我是Go语言(Golang)的新手,正在编写一个基于web的应用程序。我喜欢使用会话变量,比如PHP中的那种(从一个页面到下一个页面都可以使用,并且对于用户会话是唯一的变量)。围棋里有类似的东西吗?如果没有,我将如何着手实施它们?或者有哪些替代方法?您可能想看看。它有文档记录的会话支持 除此之外,或者可能还有其他一个用于go的web工具包,您必须自己开发 可能的解决办法可能是: goroutine per user session将会话变量存储在内存中 将变量存储在会话cookie中 使用数据

我是Go语言(Golang)的新手,正在编写一个基于web的应用程序。我喜欢使用会话变量,比如PHP中的那种(从一个页面到下一个页面都可以使用,并且对于用户会话是唯一的变量)。围棋里有类似的东西吗?如果没有,我将如何着手实施它们?或者有哪些替代方法?

您可能想看看。它有文档记录的会话支持

除此之外,或者可能还有其他一个用于go的web工具包,您必须自己开发

可能的解决办法可能是:

  • goroutine per user session将会话变量存储在内存中
  • 将变量存储在会话cookie中
  • 使用数据库存储用户会话数据

我将把每一个的实现细节留给读者。

这里有一个替代方案,以防您只需要会话支持而没有完整的web工具包


还有另一种选择(披露:我是作者):

引用其文件:


这个包提供了一个易于使用、可扩展和安全的会话实现和管理。包文件可在godoc.org上找到:

这“只是”一个HTTP会话实现和管理,您可以按原样使用,也可以与任何现有的Go web工具包和框架一起使用

概述 该方案中有3个关键参与者:

  • 会话
    是(HTTP)会话接口。我们可以使用它来存储和检索常量和变量属性
  • 存储
    是一个会话存储接口,负责存储会话,并通过服务器端的ID检索会话
  • 管理器
    是一个会话管理器接口,负责从(传入的)HTTP请求中获取
    会话
    ,并将
    会话
    添加到HTTP响应中,以让客户端了解会话。
    管理器
    有一个备份
    存储
    ,负责管理服务器端的
    会话
这个包的播放器由接口表示,并且为所有这些播放器提供了各种实现。 您不受提供的实现的约束,可以为任何玩家提供您自己的实现

用法 用法再简单不过了。要获取与关联的当前会话,请执行以下操作:

要创建新会话(例如,在成功登录时)并将其添加到(以让客户端了解该会话),请执行以下操作:

让我们看看更高级的会话创建:让我们提供一个常量属性(在会话的生命周期内)和一个初始变量属性:

sess := session.NewSessionOptions(&session.SessOptions{
    CAttrs: map[string]interface{}{"UserName": userName},
    Attrs:  map[string]interface{}{"Count": 1},
})
要访问这些属性并更改“计数”的值,请执行以下操作:

(当然,变量属性以后也可以通过
Session.SetAttr()
,而不仅仅是在会话创建时添加。)

要删除会话(例如注销时):

查看显示所有这些操作的

谷歌应用引擎支持 该软件包提供对谷歌应用程序引擎(GAE)平台的支持

文档中没有包含它(由于
+build appengine
build约束),但这里有:

该实现将会话存储在Memcache中,并将会话作为备份保存到数据存储中,以防数据从Memcache中删除。此行为是可选的,可以完全禁用数据存储。您还可以选择是同步(在同一个goroutine中)还是异步(在另一个goroutine中)保存到数据存储,从而加快响应时间

我们可以使用
NewMemcacheStore()
NewMemcacheStoreOptions()
函数创建一个会话存储实现,将会话存储在GAE的Memcache中。重要的是要注意,由于访问Memcache依赖于绑定到
http.Request
的Appengine上下文,因此返回的存储只能在请求的生存期内使用!请注意,当存储关闭时,存储将自动“刷新”从中访问的会话,因此在请求结束时关闭存储非常重要;这通常是通过关闭向其传递存储的会话管理器来完成的(最好是使用defer语句)

因此,在每个请求处理中,我们必须使用新的存储创建一个新的会话管理器,并且我们可以使用会话管理器执行与会话相关的任务,例如:

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.HandleFunc("/demo/purge", session.PurgeExpiredSessFromDSFunc(""))
过期会话不会自动从数据存储中删除。要删除过期会话,该包提供了一个
purgeexpiredsfromdsfunc()
函数,该函数返回一个。建议将返回的处理程序函数注册到一个路径,该路径可以定义为定期调用的cron作业,例如每30分钟左右调用一次(由您选择)。由于cron处理程序可能最多运行10分钟,因此返回的处理程序将在8分钟时停止 即使有更多过期、未删除的会话,也要安全完成。它可以这样注册:

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.HandleFunc("/demo/purge", session.PurgeExpiredSessFromDSFunc(""))
查看GAE会话演示应用程序,它展示了如何使用它。 演示文件显示了如何定义cron作业以清除过期会话


查看显示如何在操作中使用此功能的。谢谢您的回复。你知道我能否让gorilla和GAE合作吗?它在文档中提到了一些关于AppEngine的内容。但是我还没有深入研究它。@RossSalas看看这个:我正在使用你的包,但我不认为.Remove()会完全终止会话,因为调用会话后我仍然能够访问会话变量。有什么想法吗?这就是我用来杀死会话的方法:
session.Remove(sess,res)
sess=nil
@pascalallen它对我有效。请发布复制错误的代码。请在打开一个问题。好的,我有c
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.HandleFunc("/demo/purge", session.PurgeExpiredSessFromDSFunc(""))