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 的长度有限制

解决办法

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

猜你喜欢

热点阅读