如何打开“跨域安全性”,以便页面上的JavaScript可以自由地与SWF通信,即使它在另一个域上托管?
我确定默认情况下此函数通信被阻止,但是通过使用名为“crossdomain.xml”的文件和actionscript 3函数:system.Security.allowDomain(“*”)。虽然我没有取得足够的成功,但我没有洞察力知道哪一个是开放的。
在这种情况下我是否需要考虑其他隐藏的安全层?
我是否通过这种设置以某种方式为潜在的黑客开放了我的代码?
(如果你想知道:是的,我有使这个工作在一个场景中,html托管在一个域上,JavaScript从另一个域外部添加, SWF是由来自第三个域的JavaScript嵌入的 - 不要问为什么,它太复杂而无法解释 - 我也希望我能在一个域中托管整个事物。)
答案 0 :(得分:17)
在SWF中使用Security.allowDomain("www.example.com")
将允许来自www.example.com的页面中的JS使用ExternalInterface.addCallback()
调用SWF中公开的函数。域和子域必须完全匹配。使用"*"
将允许任何域与SWF通信,但如果您有一个特定域,则最好使用该域。
在HTML嵌入代码中将allowScriptAccess
设置为always
将允许SWF调用JavaScript函数。
抓住许多开发人员的一件事是,在SWF完成加载之前,JavaScript将无法调用SWF上的函数。不幸的是,没有基于JS的事件可以告诉你什么时候SWF准备好了(至少我发现了)。我通常做的解决这个问题的方法是在SWF完成加载时立即从SWF调用JS函数,以通知页面SWF已准备就绪。
这里和那里都有一些抽象,但是如果你看一下YUI Charts的源代码,你或许可以弄明白雅虎是怎样的。得到跨域JS / SWF通信。
答案 1 :(得分:1)
我在上一个答案中添加了一件事:如果你尝试上面的代码并且它不起作用,请检查你的网站的地址是否包含“www”。如果我把它写成
,我的工作没有也没有用Security.allowDomain("www.jeremy-knight.com");
我需要把它写成:
Security.allowDomain("jeremy-knight.com");