美文网首页
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