Go:如何不删除 cookie 上的双引号

问题描述

Go 删除​​了 cookie 中的双引号。分隔符似乎是分号加空格。即使双引号是“错误的”,也有很多包含引号的 cookie 示例。

如何在 Go 中的 cookie 中放置双引号?

例如,我正在发送一个小的 JSON 消息,Go 正在杀死作为我的 cookie。 “SetCookie”去掉双引号。

w.SetCookie("my_cookie_name",small_json_message)

还有:

  1. ; 是规定的 cookie 分隔符。

  2. RFC 明确指出 cookie 值中允许使用双引号:cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )

  3. RFC 没有说 DQUOTE 在 cookie 中的其他地方无效(参见第 1 点),而是说 whitespace DQUOTE 无效。压缩的 JSON 字符串或约束良好的 JSON 字符串不会出现此问题。

  4. cookie 是通过 HTTP 标头传输的,它在服务器和客户端之间通信时是一个 HTTP 标头。许多 HTTP 标头通常会“破坏”RFC。例如,这里有一个 Sec-Ch-Ua 标头,其中包含几个“坏”字符:

Sec-Ch-Ua:["Chromium";v="92"," Not A;Brand";v="99","Google Chrome";v="92"]

  1. 是的,我不会使用“任意 JSON”作为 cookie,但如果您的 JSON 定义明确且不包含 ;,那么应该不会有任何问题。
  2. 我已经使用一个小的、简单的 k:v json 负载完成了测试,它在主要浏览器上运行良好,没有任何问题。
  3. “逗号”是不允许的,它一直被使用。

解决方法

HTTP cookie 允许有双引号。

你确定吗? rfc6265 表示:

set-cookie-header = "Set-Cookie:" SP set-cookie-string
set-cookie-string = cookie-pair *( ";" SP cookie-av )
cookie-pair       = cookie-name "=" cookie-value
cookie-name       = token
cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
                       ; US-ASCII characters excluding CTLs,; whitespace DQUOTE,comma,semicolon,; and backslash

因此,Go 似乎遵循规范(规范之前将DQUOTE 定义为 double quote)。

有关详细信息,请参阅 this issue

,

这是一种手动设置 cookie 的方法,其中 w 是 http.responseWriter,b 是 cookie 的字节数。

w.Header().Set("Set-Cookie","your_cookie_name="+string(b)+"; Path=/; Domain=localhost; Secure; SameSite=Strict")

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...