我正在尝试将浏览器连接到提供服务器发送事件 (SSE) 的服务器。此服务器的域与原始服务器的域不同。例如,如果您调用 http://d1.example.com/page
,此页面将尝试连接到 http://d2.example.com/subscribe上的 SSE channel
。尝试这样做会提示以下错误:
Uncaught Error :SECURITY_ERR:DOM 异常 18
在线:
var source = new EventSource("http://d2.example.com/subscribe")
我该如何解决?
更新(我尝试过的解决方案):
1-CORS
我试过了 CORS通过将 Access-Control-Allow-Origin:*
添加到我的网络服务 d2.example.com
的 header 中。它没有解决 EventSource
问题,即使 $.get("http://d2.example.com")
从 d1.example.com< 调用
页面现在工作正常!我认为 SSE 适用于普通的 HTTP 请求,那么为什么它不适用于 Chrome?
2- 重定向
我使用的是 httpd 服务器,所以我在 d1.example.com
虚拟主机中创建了一个重定向规则,将 SSE 请求传递给 d2.example.com
。它与 Firefox 完美配合。而Chrome则没有提示任何错误,也没有连接到SSE服务器。看起来它转储了整个 EventSource
命令。看起来这个解决方案永远行不通,所以让我们继续......
3-反向代理
两个浏览器都连接到 d1.example.com/subscribe
,这基本上是通过反向代理连接到 d2.example.com
。但是 on_close
事件永远不会被捕获,即使浏览器已关闭。这是有道理的,因为 d2 服务器现在正在与代理服务器建立 channel 。如何将 on_close
事件从代理服务器转发到 d2?
是否有任何不同的方法可以使这项工作成功?
最佳答案
这很可能是跨源资源共享问题,您必须在相关域上启用它。
作为MDN说:
Note: Although it's not yet part of the standard, EventSource supports CORS in Firefox 11 and later. This is expected to become standard soon.
关于javascript - SSE 未捕获错误 : SECURITY_ERR: DOM Exception 18 with a server that provides Server Sent Events (SSE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14049810/