狂欢 - 在会话中存储对象

时间:2015-02-27 06:14:35

标签: session go revel

我正在使用带有狂欢的oauth软件包“code.google.com/p/goauth2/oauth”,它会创建一些包含相当多信息的结构。我需要在整个会话期间保持此信息的持久性,但会话只能是字符串类型。有没有比以下更好的方法呢?

c.Session["AccessToken"] = t.Token.AccessToken
c.Session["RefreshToken"] = t.Token.RefreshToken
...

如果不是,我如何重新分配字符串以创建另一个结构来调用Client.Get()?

2 个答案:

答案 0 :(得分:1)

您可以使用json包来转换"转换"结构为string,反之亦然。只要知道只有导出的字段以这种方式序列化。

由于oauth.Token只导出了字段,因此可以使用:

if data, err := json.Marshal(t.Token); err == nil {
    c.Session["Token"] = string(data)
} else {
    panic(err)
}

这就是你可以从会话中重建令牌的方法:

if err := json.Unmarshal([]byte(c.Session["Token"]), &t.Token); err != nil {
    panic(err)
}

答案 1 :(得分:0)

而不是你可以尝试将一些字符串ID保存到Session以及Cache所需的对象:

c.Session["id"] = id
go cache.Set("token_"+id, t.Token, 30*time.Minute)

然后按如下方式使用它:

var token oauth.Token

id := c.Session["id"]
if err := cache.Get("token_"+id, &token); err != nil {
    // TODO: token not found, do something
}

// TODO: use your token here...

这种方法的优点是你不必明确地使用json包,而且cache有一些开箱即用的后端:memory,redis,memcached。此外,基于Cookie Session的情况,您没有4K的限制。

https://revel.github.io/manual/cache.html