【发布时间】:2011-01-15 07:32:38
【问题描述】:
在我的 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 添加回调需要使用通配符的上述安全方法。
【问题讨论】:
-
crossdomain.xml 应该没关系。您的 html 是否也在服务器上,或者 html 是本地的并远程加载 swf?
-
在本地,html和flash都来自local.mydomain.com:8080。远程地,html 来自 www.mydomain.com,flash 来自 flash.mydomain.com。当我在本地将 flash 位置更改为 flash.mydomain.com 时,我遇到了同样的问题,回调不再起作用。
-
嵌入您的 Flex 应用程序的环绕 HTML 中的 allowScriptAccess 参数的值是多少?
-
params.allowscriptaccess = "always";
-
很高兴您发布关于此的更新。
标签: apache-flex flash actionscript-3 flex4