gin# 向 cookie 类型的 session store
2019-05-13 本文已影响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 的长度有限制
解决办法
- 不要再 cookie 类型的 session store 放入过多的数据
- 使用其他的 session store 代替,如 redis, memcache等等