You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言调用SetCookie时移除Cookie双引号 如何保留Cookie内双引号?

Go语言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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 02:45:02