我正在开发一个应用程序来检查我的数据库是否已更新,如果是,我的应用程序会显示新值。
客户方:
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中使用它吗?
答案 0 :(得分:1)
WebKit尚未支持SSE中的CORS。解决方案:
从同一来源获取new EventSource("/app.php");
对Safari使用CORS感知的polyfill。 https://github.com/Yaffle/EventSource
在您的SSE流(http://mydomain.org/iframe.html
)的同一来源创建iframe,在iframe中读取同源流,并使用postMessage()
将事件发送到其他来源。
答案 1 :(得分:0)
什么版本的Safari? 我相信EventSource的CORS在Chrome 25+和Safari 6.1 +之前就被破坏了。