- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要发送一个带有 websocket 握手请求的 cookie,以确保负载均衡器将请求路由到特定的后端。这在 Firefox、Safari 和 websocket-sharp 中运行良好,但我无法让 Chrome 使用 websocket 握手请求发送 cookie。
我在我的负载均衡器 (Traefik) 中启用了粘性 session ,它使用我现有的 SockJS 代码在 Firefox 和 Safari 上“正常工作”。
第一个请求没有 cookie,负载均衡器在握手响应上设置一个(101 切换协议(protocol))。随后的 websocket 握手请求发送 cookie,并且生成的 websocket 连接建立到正确的后端。
在我的 websocket-sharp 客户端中,我在打开连接之前明确设置了 cookie,它按预期工作。
Chrome 从不发送带有 websocket 握手请求的 cookie。我尝试了现有的 SockJS,使用负载均衡器在其他请求上设置的 cookie,或者在发送请求之前立即在发出 websocket 请求的文档中明确设置。
我试过简单的key=val
cookie,以及带有各种其他选项组合的 cookie,例如path
, domain
, max-age
, secure
, samesite
, ETC。
在任何站点(例如 https://www.google.com )的 Chrome 开发工具控制台中,执行:
document.cookie = 'key=val'
new WebSocket('wss://www.google.com')
wss
如果查看超过
https
的页面, 或
ws
当查看超过
http
的页面时.此外,正在查看的页面和 websocket 的 URL 中的域和端口是相同的,如
origin
中所述。生成的请求中的 header 。
GET wss://www.google.com/ HTTP/1.1
Host: www.google.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: https://www.google.com
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Sec-WebSocket-Key: HrtpryMAlu5yjGCNgxzcpw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: www.google.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Sec-WebSocket-Version: 13
Origin: https://www.google.com
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: QvNsHgLE5znjaUG04RFdPA==
DNT: 1
Connection: keep-alive, Upgrade
Cookie: <SNIPPED>; key=val
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Connection: Upgrade
Host: www.google.com
Origin: https://www.google.com
Cookie: key=val; <SNIPPED>
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: zQEpYp+yzf5EQmQSb71B6g==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15
最佳答案
更新 2:我将通过错误报告复制我发现的内容:
使用 UI 阻止 cookie 并编辑我的域的白名单异常(exception)(与禁用 cookie 的选项相同的位置)我发现以下内容:
wss://example.com 是“无效的网址”,无法添加。
为方案输入 *://或为端口输入 :* 是可能的,但会从字符串中删除,导致:
*://[*.]example.com:443 -> [*.]example.com:443 - 不起作用
*://[*.]example.com:* -> [*.]example.com - 有效
*://example.com:* -> example.com - 有效
更新 1:我提交了一个错误报告并已得到确认:
https://bugs.chromium.org/p/chromium/issues/detail?id=947413
对我有用的是在设置中全局允许 cookie。
是的,这是一种非常有效的解决方法,因为我永远不会将允许每个 cookie 放入浏览器的方法称为可接受的解决方案,但我相当确定这是一个错误。我知道它曾经在不久前使用 cookie 阻止 + 白名单来工作,但是当我将它单独放置 x 周时,某些版本破坏了它。抱歉,不知道是哪个...我不使用 Chrome,所以我真的不在乎,但也许那些这样做的人可以在 Firefox 中执行类似配置文件之类的操作,并在启用此选项的情况下创建一个开发版本,而永远不要去Facebook。
具体来说,在我的 Chrome 版本中,它位于非常狭窄的汉堡菜单 -> 设置 -> 高级 -> 内容设置... -> Cookies -> 第一个切换选项(在“允许站点保存和读取 cookie 数据(推荐)”和“阻止”)。或单击地址栏中的 cookie 图标,然后单击管理。
我在 Debian 9 中使用 Chrome 版本 73.0.3683.86(官方构建)(64 位)的 Linux 版本。看起来您使用的是 Mac OS,所以如果这些版本有些相关,这可能也会对您有所帮助。在 Windows 版本中似乎没有出现这个问题,但是我不是使用它或自己测试它的人,它可能更旧(我可以稍后在我发现时进行编辑)。它也适用于 Android(版本 73.0.3683.90),但它似乎一开始就没有阻止 cookie 的选项。
我也尝试了各种设置,我不确定使用五元组的词修饰符来检查 14000 次,但已经很多天试图弄清楚这一点。我一遍又一遍地分析了两端的 header 和代码,并认为它可能是 cookie 域/路径/过期/httponly/secure/samesite、不匹配的域、证书问题、服务器设置等,等等,但是没有,这是一个愚蠢的复选框。至少我可以继续,不必等待谷歌修复它......
关于google-chrome - 如何让 Chrome 使用 WebSocket 握手请求发送 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55367189/
假设浏览器被强制终止,并且没有关闭消息发送到 Tornado 服务器。 Tornado 怎么知道(或者它甚至知道?)这个连接已经在客户端终止了?翻看Tornado websocket code这对我来
我目前正在开发一款使用 WebSockets 的基于浏览器的多人游戏。我的首要任务是低延迟以及与各种平台和网络设置的兼容性。 但是我正在做密码验证。我还有聊天功能,我认为玩家的隐私很重要。因此,我认为
我必须设计一个解决方案,允许通过远程托管的网络应用程序读取本地传感器生成的实时数据。 设计仍在进行中:传感器的数据可以由安装在客户端计算机上的 Windows 应用程序/服务处理,或者由位于客户端计算
WebSocket的端口是什么? WebSocket 使用什么协议(protocol)? 当防火墙阻止除 80 和 443 端口之外的所有端口时,WebSocket 是否工作? 最佳答案 What i
有一个 fantastic answer其中详细介绍了 REST apis 的工作原理。 websockets 如何以类似的细节工作? 最佳答案 Websocket 创建并代表了服务器和客户端之间双向
请原谅我的无知,因为我在负载均衡器和 websockets 方面的经验有限。我试图了解客户端如何通过 websockets 连接到位于负载均衡器后面的服务器集群。 我对负载均衡器的理解是它们就像反向代
我正在尝试使用 websocket 发送音频消息,我应该将音频流更改为什么类型的消息,以便我可以使用套接字发送? 如果我直接使用 websocket.send(audio),我会得到一个错误“DOME
我对 WebSockets 的前景感到非常兴奋。由于我在过去构建了一些基于桌面套接字的游戏和 Web 游戏,因此我热衷于将这两种方法结合起来构建基于 Web 的多人游戏,而无需长时间轮询。 自从 Fi
我读过很多关于实时推送通知的文章。并且简历是 websocket 通常是首选技术,只要您不关心 100% 的浏览器兼容性。然而,one article指出 Long polling - potenti
我很难找到文档或教程,以便通过网络套接字发送文件。 这是我的JS: ['dragleave', 'drop'].forEach(event_name => document.addEventListe
我正在使用 Dart 的 WebSocket 类(dart:io 和 dart:html 版本)连接到 Dart WebSocket 服务器。当我让客户端使用自定义关闭代码和原因关闭 Web 套接字连
谷歌浏览器框架是否支持 websocket? 最佳答案 答案是肯定的,Chrome Frame supports websockets .我不确定,但这也可能取决于您安装的 Chrome 版本。我有
是否可以在同一应用程序(同一端口)中托管一个普通 Bottle 应用程序和一个 WebSocket 应用程序(例如: https://github.com/defnull/bottle/blob/ma
我有一个支持网络套接字的服务器。浏览器连接到我的网站,每个浏览器都会打开一个到 www.mydomain.example 的 Web 套接字。这样,我的社交网络应用程序就可以向客户端推送消息。 传统上
我是 Websockets 新手。在阅读有关 websockets 的内容时,我无法找到一些疑问的答案。我希望有人能澄清一下。 websocket 是否仅将数据广播到所有连接的客户端而不是发送到特定客
客户端可以通过 websockets 连接到服务器多长时间?是否有时间限制,它们是否有可能连在一起多年? 最佳答案 理论上,WebSocket 连接可以永远持续下去。假设端点保持正常运行,长期存在的
我正在尝试使用 websockets 制作自己的聊天客户端,并认为我会从 Tomcat 7 websocket chat example code. 开始。 .我已经成功编译并部署了ChatAnnot
我有一个使用 AdSense 的应用程序,据我所知,由于 AdSense 政策,不允许进行轮询。我想知道如果我使用 WebSockets 并且服务器在创建新数据时向客户端发送新数据并且在客户端上显示新
在 servlet 世界中,我会使用 cookie 和 HttpSession 之类的东西来识别谁在访问我的 Restful 服务以将请求路由到正确的数据。将 Sec-WebSocket-Key 用作
我必须使用 websocket 实现一个聊天应用程序,用户将通过群组聊天,可以有数千个群组,并且一个用户可以在多个群组中。我正在考虑两种解决方案: [1] 对于每个群聊,我创建一个 websocket
我是一名优秀的程序员,十分优秀!