Actionscript的ExternalInterface.addCallback只在本地有效,而不在生产环境有效。

7

在我的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添加回调需要上述带通配符的Security方法。

crossdomain.xml不应该有影响。你的HTML文件是在服务器上还是本地加载远程SWF文件? - greggreg
你的 Flex 应用程序嵌入到周围 HTML 中时,allowScriptAccess 参数的值是什么? - Florian F
params.allowscriptaccess = "always"; 参数.allowscriptaccess = "always"; - at.
1
你很棒,因为你发布了这些更新。 - Robusto
1个回答

2

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

因为你的SWF和HTML不属于同一个合格的域,所以你必须将allowScriptAccess的值设置为always。 但要小心,因为这意味着如果你在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


好的,那么请在您的 addCallback 代码周围加上 try/catch,看看是否会抛出任何安全错误。 - Florian F
我刚刚阅读了所有这些链接并尝试了每一个方法:allowScriptAccess="always"(之前已经设置过),allowNetworking="all",Security.allowDomain(""),Security.allowInsecureDomain("")(为了保险起见)。但是什么都不起作用 :(。 - at.
我已经尝试在addCallback代码周围使用try/catch块,但是catch块从未被执行... - at.
我搞定了!在尝试各种安全设置的组合时摸索...现在我需要确切地知道它为什么能工作。 - at.
好的,基本上我必须同时执行Security.allowDomain("")和Security.allowInsecureDomain("")。将其设置为flash.mydomain.com并不能解决问题,我必须使用通配符。allowNetworking没有效果。我需要allowScriptAccess="always",但我之前已经有了这个。只需使用该参数,使用ExternalInterface.call调用JavaScript非常容易。但是,如果要添加回调,则需要使用上述带有通配符的安全方法,使用ExternalInterface.addCallback。 - at.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接