在我的 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 应用程序来自同一个本地网络服务器。然而,在生产中,它只是 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
需要上述带有通配符的安全方法。
最佳答案
SWF 和 DOM 之间的通信不由跨域文件处理。
Flash 内容和导航器之间的这种交互由 的值处理。 allowScriptAccess 和 允许网络 包装您的 SWF 的 html 中的标签。
因为您的 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
关于apache-flex - Actionscript 的 ExternalInterface.addCallback 只能在本地工作,不能在生产中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4698506/