您的位置:首页 > 编程语言 > Go语言

使用golang gin框架sessions时碰到的gob问题

2018-07-04 15:01 3215 查看
使用golang开发后端api,使用的是gin框架。上线之后需要用到权限控制,就得先把登录功能加上。

添加登录过程中,引入了gin的sessions间件 : https://github.com/gin-contrib/sessions

并使用最简单的cookie来保存session

第一版的代码如下:

func userLogin(c *gin.Context) (interface{}, *common.APIError) {
var param = &types.User{}
err := c.BindJSON(¶m)
if err != nil {
return "request error", common.WrapAndLog("parase request data error", err)
}
u := user.UserLogin(*param)
if u.Uid != "" {
session := sessions.Default(c)
session.Set("login_user", u)
session.Save()
return u, nil
}
return nil, nil
}

func userInfo(c *gin.Context) (interface{}, *common.APIError) {
session := sessions.Default(c)
u := session.Get("login_user")
logrus.Debug("login user ", session, session.Get("login_user"))
return u, nil
}

不管怎么测试都无法通过session获取登录用户信息,cookie里面也没有相关的数据,后面经过查看sessions的源代码和debug,发现
/vendor/github.com/gorilla/sessions/store.go的如下方法中有报错,通过断点看出其中err!= nil

func (s *CookieStore) Save(r *http.Request, w http.ResponseWriter,
session *Session) error {
encoded, err := securecookie.EncodeMulti(session.Name(), session.Values,
s.Codecs...)
if err != nil {
return err
}
http.SetCookie(w, NewCookie(session.Name(), encoded, session.Options))
return nil
}

打印出的error信息如下:

securecookie: error - caused by: securecookie: error - caused by: gob: type not registered for interface: types.User

经过网上搜索,添加如下代码解决

gob.Register(types.User{})

gob是Golang包自带的一个数据结构序列化的编码/解码工具。

对高级对象进行编码和解码,需要先调用gob.Register进行类型注册,比如自定义struct,map[string]interface{}{}等等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐