golang gin get cookie json

svmlkihl  于 2023-05-20  发布在  Go
关注(0)|答案(1)|浏览(231)

我使用gin@v1.9.0
尝试从请求中获取cookie
Cookie示例:
key={"ckey": "cvalue"}
验证码:
token, err := c.Request.Cookie("key")
返回错误
http: named cookie not present
但不带花括号,工作正常
Cookie示例:
key=cvalue
接收token = "key=cvalue"

qxsslcnc

qxsslcnc1#

出现此问题是因为cookie值格式。
让我们看看这些来自net/http的代码

// Strip the quotes, if present.
if allowDoubleQuote && len(raw) > 1 && raw[0] == '"' && raw[len(raw)-1] == '"' {
    raw = raw[1 : len(raw)-1]
}

该语句用于从字符串的开头和结尾剥离"{"ckey": "cvalue"}无法删除此字符串中的引号。
然后它调用另一个函数,这个函数是一个循环,它遍历每个字符并检查字符是否是有效字节。

for i := 0; i < len(raw); i++ {
        if !validCookieValueByte(raw[i]) {
            return "", false
        }
    }

validCookieValueByte实现

func validCookieValueByte(b byte) bool {
    return 0x20 <= b && b < 0x7f && b != '"' && b != ';' && b != '\\'
}

检查在这里失败。因为我们在{"ckey": "cvalue"}中有一个"
让我们用一个示例代码来检查一下

func main() {
    router := gin.Default()

    router.GET("/get-cookie", func(c *gin.Context) {
        cookie, err := c.Request.Cookie("key")
        if err != nil {
            c.String(http.StatusBadRequest, err.Error())
            return
        }
        c.String(http.StatusOK, fmt.Sprintf("token = key=%v", cookie.Value))
    })

    router.Run(":8080")
}

这会失败的

curl --request GET \
  --url http://localhost:8080/get-cookie \
  --cookie key='{"ckey": "cvalue"}'

但这次会成功的

curl --request GET \
  --url http://localhost:8080/get-cookie \
  --cookie key='{ckey: cvalue}'

我们可以使用http.Cookie将cookie设置为json

val := `{"ckey": "cvalue"}`
cookie := &http.Cookie{
    Name:  "key",
    Value: val,
}
http.SetCookie(c.Writer, cookie)

SetCookie将在保存值之前删除"

相关问题