跨域Websocket连接导致NS_ERROR_DOM_SECURITY_ERR

Sam*_*gal 5 firefox websocket

我试图从trial.domain.com连接到server.domain.com上的websocket

Firefox中的NS_ERROR_DOM_SECURITY_ERR:

"[Exception... "Security error" code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: "https://trial.domain.com/home Line: 454"]"
Run Code Online (Sandbox Code Playgroud)

当我尝试建立WebSocket连接时:

try {
  if (window['MozWebSocket'] !== undefined) {
    socket = new MozWebSocket('ws://server.domain.com/chat');
  } else {
    socket = new WebSocket('ws://server.domain.com/chat');
  }
  trails = 0;
} catch(err){
  trials++;
}
Run Code Online (Sandbox Code Playgroud)

mok*_*oka 4

这种情况是由应用安全策略的浏览器发生的,该策略阻止使用对页面本身托管的外部域的任何访问。
当您尝试从 SSL 区域到非 SSL 和另一个域(不知道同一域是否可以解决问题)获得重要连接时,会发生这种情况 - 这就是您的情况。但这种情况还有更多可能的情况。

这是与浏览器相关的错误,并且是浏览器抛出此错误,并且自身连接没有问题。

您必须将 WebSockets 服务器托管在与 http 服务器相同的域下。如果这是不可能的,您可以采取以下几种方法:

  1. 如果软件是内部使用的,并且可以在浏览器中进行设置使用,那么可以禁用跨域安全策略:
    • Firefox,在“about:config”下将“ecurity.fileuri.strict_origin _policy”设置为“false”。
    • Chrome,使用标志“--allow-file-access-from-files”运行
  2. 如果您有权访问域的 DNS 设置,则可以创建子转发器,并且看起来您正在连接到同一域。不确定这个选项在实践中是否有效,但看起来不错。

  • 请提供 Firefox 的版本。我看到您正在从 HTTPS 区域转到非 SSL(ws://,但不是 wss:://)。这可能会引起问题。如果您使用 SSL,则应该使用 WSS - 它是 WebSockets SSL。 (3认同)