我需要发送带有 websocket 握手请求的 cookie,以确保负载均衡器将请求路由到特定后端。这在 Firefox、Safari 和 websocket-sharp 中工作正常,但我无法让 Chrome 使用 websocket 握手请求发送 cookie。
我在我的负载均衡器 (Traefik) 中启用了粘性会话,它在 Firefox 和 Safari 上使用我现有的 SockJS 代码“正常工作”。
第一个请求没有 cookie,负载均衡器在握手响应(101 交换协议)上设置一个。后续的 websocket 握手请求发送 cookie,生成的 websocket 连接建立到正确的后端。
在我的 websocket-sharp 客户端中,我在打开连接之前显式设置了 cookie,它按预期工作。
Chrome 从不发送带有 websocket 握手请求的 cookie。我尝试了现有的 SockJS,在其他请求上由负载均衡器设置 cookie,或者在发送请求之前立即在发出 websocket 请求的文档中明确设置。
我想简单的key=val饼干,并与选项设置,例如各种其它组合饼干path,domain,max-age,secure,samesite,等。
在任何站点(例如https://www.google.com)的 Chrome 开发工具控制台中,执行:
document.cookie = 'key=val'
new WebSocket('wss://www.google.com')
Run Code Online (Sandbox Code Playgroud)
请注意,该方案必须是wss在查看页面时https或ws查看页面时http。此外,所查看的页面中的域和端口以及 websocket 的 URL 是相同的,如origin …