我使用gin@v1.9.0
正在try 从请求获取Cookie
Cookie示例:
key={"ckey": "cvalue"}
个
代码:
token, err := c.Request.Cookie("key")
个
返回错误
http: named cookie not present
个
但没有花括号,工作起来很好
Cookie示例:
key=cvalue
个
接收
token = "key=cvalue"
个
我使用gin@v1.9.0
正在try 从请求获取Cookie
Cookie示例:
key={"ckey": "cvalue"}
个
代码:
token, err := c.Request.Cookie("key")
个
返回错误
http: named cookie not present
个
但没有花括号,工作起来很好
Cookie示例:
key=cvalue
个
接收
token = "key=cvalue"
个
发生此问题是因为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]
}
此语句用于从字符串的开头和结尾go 掉"
.
{"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将在保存值之前删除"
.