美文网首页
gin# 向 cookie 类型的 session store

gin# 向 cookie 类型的 session store

作者: 风亡小窝 | 来源:发表于2019-05-13 21:45 被阅读0次

问题描述

在使用 gin 的 session 中间件 github.com/gin-contrib/sessions 时,遇到的一个奇怪的问题:

当 session store 使用 cookie.NewStore([]byte("secret"))

func Session(sname string) gin.HandlerFunc {
    store := cookie.NewStore([]byte("secret"))
    store.Options(sessions.Options{
        Domain: "/",
        MaxAge: 30 * 60,
    })
    return sessions.Sessions("uid", store)
}

向 session store 放入大量数据后,生成的响应中没有 Set-Cookie 头部

r.Use(Session("uid"))
r.POST("/test", func(c *gin.Context) {
    session := sessions.Default(c)
    for i := 0; i < 1000; i++ {
        session.Set("data"+strconv.Itoa(i), strconv.Itoa(i))
    }
    session.Save()
    c.JSON(200, gin.H{
        "status": "success"
    })
})

错误原因

cookie.NewStore(...)使用的是 cookie 来保存数据。在调用session.Save()后,存入 session 的数据会被加密编码后放入Set-Cookie头部中。而出现问题的根本原因则是:

游览器或者 server 对 cookie 的长度有限制

解决办法

  1. 不要再 cookie 类型的 session store 放入过多的数据
  2. 使用其他的 session store 代替,如 redis, memcache等等

相关文章

网友评论

      本文标题:gin# 向 cookie 类型的 session store

      本文链接:https://www.haomeiwen.com/subject/drddaqtx.html