【问题标题】:Actionscript's ExternalInterface.addCallback only working locally, not in productionActionscript 的 ExternalInterface.addCallback 只能在本地工作,不能在生产环境中工作
【发布时间】: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


【解决方案1】:

跨域文件不处理 SWF 和 DOM 之间的通信。 Flash 内容和导航器之间的这种交互由包装 SWF 的 html 中的 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

【讨论】:

  • 我的 allowscriptaccess 值始终设置为“始终”。此外, ExternalInterface.call("javascriptMethod", argument);工作正常,允许 Flex 应用程序调用 javascript 代码。 ExternalInterface.callback 没有。
  • 好的,然后用 try/catch 覆盖您的 addCallback 代码,看看是否有任何 SecurotyError 抛出。
  • 我刚刚阅读了所有这些链接并尝试了所有链接; allowScriptAccess="always"(之前有过)、allowNetworking="all"、Security.allowDomain("")、Security.allowInsecureDomain("")(为了更好的衡量标准)。没有任何效果:(。
  • 我已经在 addCallback 代码周围尝试了 try/catch 块,但 catch 块永远不会被执行......
  • 我让它工作了!摸索着尝试各种安全设置组合......现在我需要看看它为什么会起作用。
猜你喜欢
  • 2019-04-18
  • 2016-07-16
  • 2018-03-23
  • 2020-08-25
  • 1970-01-01
  • 2015-05-15
  • 2019-08-17
  • 1970-01-01
  • 2020-11-14
相关资源
最近更新 更多