Go语言调用SetCookie时移除Cookie双引号 如何保留Cookie内双引号?
问题背景
Go标准库的net/http包SetCookie方法会自动过滤Cookie值中的双引号,当需要将小型JSON字符串作为Cookie值存储时,JSON的双引号会被自动移除,无法符合预期的存储需求。
可行解决方案
方案1:手动构造Set-Cookie响应头
直接绕过Go内置的Cookie校验逻辑,自行构造符合RFC规范的Set-Cookie头写入响应,可完整保留JSON的双引号:
import "fmt" // smallJSON为你的JSON字符串,需确保不含;、逗号、空格、反斜杠等Cookie禁用字符 cookieHeader := fmt.Sprintf("my_cookie_name=%s; Path=/; Max-Age=86400; HttpOnly", smallJSON) w.Header().Add("Set-Cookie", cookieHeader)
该方案完全符合RFC 6265对Cookie值的定义,经过测试可在所有主流浏览器上正常运行,适合JSON结构固定、内容可控的场景。
方案2:编码后存储(兼容性最优)
如果担心手动构造头的兼容性问题,可以先对JSON做URL安全的Base64编码后再调用标准库方法存储,读取时解码即可:
import ( "encoding/base64" "net/http" ) // 写入Cookie encodedVal := base64.URLEncoding.EncodeToString([]byte(smallJSON)) w.SetCookie(&http.Cookie{ Name: "my_cookie_name", Value: encodedVal, Path: "/", MaxAge: 86400, HttpOnly: true, }) // 读取Cookie cookie, err := r.Cookie("my_cookie_name") if err == nil { decodedBytes, err := base64.URLEncoding.DecodeString(cookie.Value) if err == nil { smallJSON = string(decodedBytes) } }
该方案完全适配Go标准库的Cookie处理逻辑,不存在任何兼容性风险,仅会让Cookie值长度增加约33%。
补充说明
根据RFC 6265的规范定义,Cookie值本身就支持带双引号的格式,语法定义为:cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
只要Cookie值内不包含;、逗号、空格和反斜杠,带双引号的JSON内容完全符合协议要求,实际生产环境中也存在大量类似用法:
- 很多HTTP头本身就不会严格遵循RFC,例如Chrome的
Sec-Ch-Ua头就包含多个非规范字符,示例:Sec-Ch-Ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92" - 协议规定不允许使用的逗号等字符,在实际应用中也被频繁使用
- 现实场景中存在大量包含双引号的Cookie运行实例
内容的提问来源于stack exchange,提问作者Zamicol
相关产品推荐
相关产品推荐

