Revel - 在会话中存储对象
Revel - Storing an object in session
我正在使用带有 revel 的 oauth 包 "code.google.com/p/goauth2/oauth",它创建了一些包含大量信息的结构。我需要此信息在整个会话期间保持不变,但会话只能是字符串类型。有比以下更好的方法吗?
c.Session["AccessToken"] = t.Token.AccessToken
c.Session["RefreshToken"] = t.Token.RefreshToken
...
如果不是,我该如何重新分配字符串以创建另一个结构来调用 Client.Get()?
您可以使用 json
包到 "convert" 结构到 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)
}
您可以尝试将一些字符串 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
包,并且缓存有几个开箱即用的不同后端:内存、redis、memcached。此外,在基于 Session
.
的 Cookie
的情况下,您没有 4K 的限制
我正在使用带有 revel 的 oauth 包 "code.google.com/p/goauth2/oauth",它创建了一些包含大量信息的结构。我需要此信息在整个会话期间保持不变,但会话只能是字符串类型。有比以下更好的方法吗?
c.Session["AccessToken"] = t.Token.AccessToken
c.Session["RefreshToken"] = t.Token.RefreshToken
...
如果不是,我该如何重新分配字符串以创建另一个结构来调用 Client.Get()?
您可以使用 json
包到 "convert" 结构到 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)
}
您可以尝试将一些字符串 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
包,并且缓存有几个开箱即用的不同后端:内存、redis、memcached。此外,在基于 Session
.
Cookie
的情况下,您没有 4K 的限制