Apache flex Actionscript';s ExternalInterface.addCallback仅在本地工作,不在生产环境中工作

Apache flex Actionscript';s ExternalInterface.addCallback仅在本地工作,不在生产环境中工作,apache-flex,flash,actionscript-3,flex4,Apache Flex,Flash,Actionscript 3,Flex4,在我的Flex应用程序中,我需要一个Javascript控件来调用我的一个Actionscript方法。很简单,根据Flex/Actionscript文档,我在Actionscript代码中写了以下内容: if (ExternalInterface.available) ExternalInterface.addCallback("setName", setNameInActiveWindow); 在我编写的Javascript控件中: document.getElementById(

在我的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文件,但这似乎是某种域安全问题。我需要更改crossd中的某些内容吗omain.xml?我需要获得
ExternalInterface.addCallback
才能工作吗


更新2:让它工作起来!我必须同时执行
安全性。allowDomain(“*”
安全性。AllowSecureDomain(“*”)
。将其设置为flash.mydomain.com并不能解决问题,我必须使用通配符。
allowNetworking
没有效果。我需要
allowScriptAccess=“always”
,但我以前就有过。使用
ExternalInterface.call调用Javascript很容易使用该参数。但是使用
ExternalInterface.addCallback
添加回调需要使用通配符的上述安全方法。

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

因为您的SWF和HTML不是来自同一个限定域,所以必须将allowScriptAccess值设置为始终。 但是要小心,因为这意味着如果您在SWF中加载不受信任的内容,它也将访问DOM页面,并可能进行恶意操作

有关更多信息,请查看:

http://kb2.adobe.com/cps/407/kb407748.html

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”;很适合发布更新。my allowScriptAccess值始终设置为“always”。此外,ExternalInterface.call(“javascriptMethod”,参数);允许Flex应用程序调用javascript代码可以正常工作。ExternalInterface.callback不会。好的,然后用try/catch检查addCallback代码,看看是否抛出任何安全错误。我刚刚阅读了所有这些链接并尝试了所有操作;allowScriptAccess=“always”(以前有过),allowNetworking=“all”,Security.allowDomain(“”),Security.AllownSecureDomain(“”)。什么都不起作用:(。我在addCallback代码周围尝试了try/catch块,但catch块从未执行过……我成功了!摸索着尝试各种安全设置组合……现在我需要确切地了解它为什么起作用。