Session Revel-在会话中存储对象

Session Revel-在会话中存储对象,session,go,revel,Session,Go,Revel,我将oauth包“code.google.com/p/goauth2/oauth”与revel一起使用,它创建了一些包含大量信息的结构。我需要此信息在整个会话中保持不变,但会话只能是string类型。有没有比下面更好的方法 c.Session["AccessToken"] = t.Token.AccessToken c.Session["RefreshToken"] = t.Token.RefreshToken ... 如果没有,我如何重新分配字符串以创建另一个结构来调用Client.Get(

我将oauth包“code.google.com/p/goauth2/oauth”与revel一起使用,它创建了一些包含大量信息的结构。我需要此信息在整个会话中保持不变,但会话只能是string类型。有没有比下面更好的方法

c.Session["AccessToken"] = t.Token.AccessToken
c.Session["RefreshToken"] = t.Token.RefreshToken
...
如果没有,我如何重新分配字符串以创建另一个结构来调用Client.Get()?

您可以使用包将结构“转换”为
字符串,反之亦然。只需知道,只有导出的字段是以这种方式序列化的

由于
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保存到
会话
,以及需要
缓存的对象

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有几个不同的后端:内存、redis、memcached。此外,与基于
Cookie
会话
相比,您没有4K的限制


您可以使用简单的方法,例如使用
encoding/json
将数据编码为字符串。其他选项将是base64编码的gob。或者只需像上面所示,在会话中单独存储各个部分,并使用两个助手从
t.Token
存储,然后从会话数据重新创建
t.Token
。谢谢!工作非常出色!我使用了jsonT,err:=json.Marshal(t)和var t*oauth.Transport json.Unmarshal([]字节(c.Session[“jsonT”]),&t)谢谢!