Actionscript的ExternalInterface.addCallback只在本地工作,而不是在生产中

时间:2011-01-15 07:32:39

标签: flex flash actionscript-3 flex4

在我的Flex应用程序中,我需要一个Javascript控件来调用我的一个Actionscript方法。很简单,根据Flex / Actionscript文档,我在我的Actionscript代码中写了这个:

if (ExternalInterface.available)
    ExternalInterface.addCallback("setName", setNameInActiveWindow);

在我写的Javascript控件中:

document.getElementById('FlexAppId').setName(name);

效果很好。完全符合预期,所以我去了生产。但它在生产中不起作用:(。相同的代码......我无法弄明白。上面的Javascript代码已经运行,但回调没有在Actionscript代码中执行。

这是否与域名安全有关?在本地,我使用local.mydomain.com:8080,其中local.mydomain.com解析为127.0.0.1(我需要这样做,以便一些小部件正常工作)。 Flex应用程序来自同一个本地Web服务器。然而,在生产中,它只是www.mydomain.com(mydomain.com不是真正的域名),Flex应用程序来自flash.mydomain.com(CDN)。

我在www.mydomain.com上有一个crossdomain.xml文件:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
        <site-control permitted-cross-domain-policies="master-only"/>
        <allow-access-from domain="*.mydomain.com"/>
</cross-domain-policy>

更新 :我尝试更改本地环境,以便从flash.mydomain.com引用Flex应用程序,就像在生产环境中一样。事实证明我在本地也遇到了同样的问题...所以看起来这是某种域安全问题,尽管我上面有crossdomain.xml文件。我是否需要在crossdomain.xml中更改某些内容?我需要一些额外的工作才能使ExternalInterface.addCallback起作用吗?

更新2 :搞定了!我必须同时执行Security.allowDomain("*")Security.allowInsecureDomain("*")。将其设置为flash.mydomain.com没有解决问题,我不得不放一个通配符。 allowNetworking没有效果。我需要allowScriptAccess="always",但我之前有过。使用ExternalInterface.call调用Javascript只需使用该参数即可轻松完成。但是使用ExternalInterface.addCallback添加回调需要使用带有通配符的上述安全方法。

1 个答案:

答案 0 :(得分:2)

跨域文件不处理SWF与DOM之间的通信。 Flash内容和导航器之间的这种交互是通过包装SWF的html中的 allowScriptAccess allowNetworking 标记的值来处理的。

由于您的SWF和HTML不是来自同一个合格域,因此您必须将 allowScriptAccess 值设置为始终。 但请注意,因为这意味着如果您在SWF中加载不受信任的内容,它也可以访问DOM页面并可能做恶意事件。

欲了解更多信息,请查看:

http://tv.adobe.com/watch/how-to-develop-secure-flash-platform-apps/scripting-and-allowscriptaccess/ http://kb2.adobe.com/cps/407/kb407748.html http://blogs.adobe.com/stateofsecurity/2007/07/how_to_restrict_swf_content_fr_1.html