服务器发送事件 - 跨域safari

时间:2013-09-01 18:10:55

标签: php safari cross-domain server-sent-events

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

客户方:

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中使用它吗?

2 个答案:

答案 0 :(得分:1)

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

  1. 从同一来源获取new EventSource("/app.php");

  2. 对Safari使用CORS感知的polyfill。 https://github.com/Yaffle/EventSource

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

答案 1 :(得分:0)

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