我使用gin@v1.9.0尝试从请求中获取cookieCookie示例:key={"ckey": "cvalue"}验证码:token, err := c.Request.Cookie("key")返回错误http: named cookie not present但不带花括号,工作正常Cookie示例:key=cvalue接收token = "key=cvalue"
key={"ckey": "cvalue"}
token, err := c.Request.Cookie("key")
http: named cookie not present
key=cvalue
token = "key=cvalue"
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"}无法删除此字符串中的引号。然后它调用另一个函数,这个函数是一个循环,它遍历每个字符并检查字符是否是有效字节。
"
{"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将在保存值之前删除"。
1条答案
按热度按时间qxsslcnc1#
出现此问题是因为cookie值格式。
让我们看看这些来自net/http的代码
该语句用于从字符串的开头和结尾剥离
"
。{"ckey": "cvalue"}
无法删除此字符串中的引号。然后它调用另一个函数,这个函数是一个循环,它遍历每个字符并检查字符是否是有效字节。
validCookieValueByte实现
检查在这里失败。因为我们在
{"ckey": "cvalue"}
中有一个"
让我们用一个示例代码来检查一下
这会失败的
但这次会成功的
我们可以使用http.Cookie将cookie设置为json
SetCookie将在保存值之前删除
"
。