1

我正在开发一个应用程序来检查我的数据库是否已更新,如果是,我的应用程序会显示新值。

客户端:

if(typeof(EventSource)!=="undefined") {
  var eSource = new EventSource("http://mydomain.org/app.php");
  eSource.onmessage = function(event) {}
}

服务器端:

<?php
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Access-Control-Allow-Origin: *");
echo "data:Hello World\n\n";
?>

现在,一切都在 Firefox 和 Chrome 中运行。该应用程序将在基于 Safari 的浏览器中运行。在 Safari 中,我得到

SECURITY_ERR: DOM Exception 18: An attempt was made to break through the security policy of the user agent.

所以这个问题与跨域发布有关,即使 Access-Control-Allow-Origin 有一个通配符。有什么方法可以在 Safari 中完成这项工作?

4

2 回答 2

1

WebKit 尚不支持 SSE 中的 CORS。解决方案:

  1. 取同源,new EventSource("/app.php");

  2. 为 Safari 使用可识别 CORS 的 polyfill。https://github.com/Yaffle/EventSource

  3. 在与您的 SSE 流 ( ) 相同的来源创建 iframe,在 iframe 中http://mydomain.org/iframe.html读取同源流,并用于postMessage()将事件发送到其他来源。

于 2013-09-01T18:20:39.013 回答
0

什么版本的 Safari?我相信 EventSource 的 CORS 在 Chrome 25+ 和 Safari 6.1+ 之前被破坏了。

于 2013-11-03T09:58:21.137 回答