正如您所知,RFC 6265 指出可以使用多个名称为 Set-Cookie
的标头。
然而,Fetch API 不允许这样做,因为其 Headers 接口公开的所有方法(包括 get()
、set()
、append()
、entries()
以及其他所有方法)都已实现为将具有相同名称的所有标头的值合并为单个由逗号分隔的标头。
例如,如果我们执行以下操作:
var headers = new Headers();
headers.append('content-type', 'text/plain');
headers.append('set-cookie', 'test1=v; Max-Age=0');
headers.append('set-cookie', 'test2=v; Max-Age=0');
headers.append('set-cookie', 'test3=v; Max-Age=0');
然后我们尝试使用get('set-cookie')
或通过对headers
变量进行entries()
迭代来读取set-cookie
值,我们得到如下结果:
'set-cookie' : test1=v; Max-Age=0, test2=v; Max-Age=0, test3=v; Max-Age=0
请注意,如果我们尝试读取或操作具有相同名称的多个标头的现有响应对象(即由其他框架创建的支持此允许行为的框架),则会发生相同的错误行为:换句话说,似乎Fetch API
完全无法正确处理这种情况。现在,虽然某些标头(如Accept
)需要此行为,但大多数浏览器(包括Chrome和Firefox)无法正确解析Set-Cookie
标头,因此无法正确设置Cookie。这是否是已知的错误?如果是这样,是否有可用的解决方法可以克服这个问题?
.entries()
迭代标头时,是否会获得单独的条目? - EvertSet-Cookie
是由服务器发送的,而不是客户端。为什么在 Fetch API 中需要它? - Barmar