为什么在WebSocket握手请求头中看不到cookie值?

6
我希望能够从一个html页面发送一个websocket握手请求,我写的代码如下:
  document.cookie = "guestId=xxxx; remember=xxxxxx;";
  var ws = new WebSocket("ws://localhost:5000/ws");

但是在Chrome开发工具中显示,没有发送任何cookie:
General:
  Request URL:ws://localhost:5000/ws
  Request Method:GET
  Status Code:307 Temporary Redirect
Response Headers
  Content-Length:59
  Content-Type:text/html; charset=utf-8
  Date:Fri, 18 Mar 2016 09:39:11 GMT
  Location:/preorder/landing/index
Request Headers
  Accept-Encoding:gzip, deflate, sdch
  Accept-Language:en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
  Cache-Control:no-cache
  Connection:Upgrade
  Host:localhost:5000
  Origin:http://localhost:63342
  Pragma:no-cache
  Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
  Sec-WebSocket-Key:t3N0vVaLCsOmOXLSh+Arsw==
  Sec-WebSocket-Version:13
  Upgrade:websocket
  User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36

我该如何解决这个问题?为什么请求头中没有cookie?如果我发送其他未升级的ajax请求,我可以在开发工具中看到cookie。为什么会有这样的差异?

2个回答

2
你的Origin头部是http://localhost:63342,WS请求是ws://localhost:5000/ws,因此你的域名不同(端口不同)。我想你的其他ajax请求都是发送到http://localhost:63342,因此浏览器会发送cookie。

不同的端口不会改变cookie的域; cookie在同一域上的端口之间是明确共享的。 - Jez
@Jez 嗯,我认为你的看法一般是正确的。这种行为通常被认为是不正确的(意思是cookie应该已经进行CORS隔离,但没有,并且为了保持向后兼容性而保留),但实际浏览器行为的历史却不稳定,某些浏览器的某些版本肯定通过TCP端口隔离了cookie……你希望这些问题现在不会再发生,但是OP是7年前发布的,所以我不确定……如果你愿意的话,可以去研究或测试那个操作系统上的Chrome的具体版本,但我觉得那很费力 :D - Michael
@Jez 当然还有其他可能性,一些显而易见的可能会被各种研究或尝试排除,但就我而言,我认为建议的答案是一个合理的停止点,毕竟我不是为OP工作的:D 如果你在这一点上是正确的,因此我必须转向我能想到的下一个可能性,我会想知道设置document.cookie是否无效,因为websocket库的工作方式可能需要显式地发送cookie头部。也许我应该发表两个答案:D - Michael
它似乎在RFC 6265中被标准化了,所以区分端口的浏览器并没有遵循这一点。作为一个Web开发人员,我发现它对他们不区分端口非常方便,因为当我在本地主机上进行开发时,我可能会在多个端口上运行多个进程,这些进程需要共享cookie,就像在生产系统中在域和其子域之间共享一样。 - Jez

-2

你可以尝试一下

ws.on("headers", function(headers) {
    headers["set-cookie"] = "yokokkie";
});

1
这是行不通的。只有4种消息类型:close、error、message和open。https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#events - Tranzium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接