2013-09-01 45 views
1

我正在开发一个应用程序,检查我的数据库是否已更新,如果是,我的应用程序显示新值。服务器发送事件 - 跨域safari

客户端:

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. 

所以这个问题已经是与跨域张贴,即使访问控制允许来源有一个通配符。任何方式使这项工作在Safari?

回答

1

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

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

  2. 使用CORS感知填充工具。 https://github.com/Yaffle/EventSource

  3. 创建在相同的起源,你的SSE流(http://mydomain.org/iframe.html),在iframe读同源流iframe和使用postMessage()事件发送到其他来源。

+0

解决方案1:HTML文件必须从硬盘驱动器运行(如浏览器中的小部件)。 解决方案3:用户可以提供样式参数,因此使用iFrame时,不可能从另一个原点对元素进行样式设置。 看来我将不得不寻找解决方案2. –

+0

@TomBroucke iframe可能是不可见的。 – Kornel

+0

是的,我之前没有使用过postMessage(),但是这对我的问题来说似乎是一个很好的解决方案。谢谢 –

0

什么版本的Safari? 我相信EventSource的CORS在Chrome 25+和Safari 6.1+之前已经崩溃。