【问题标题】:How do I call a Flex SWF from a remote domain using Flash (AS3)?如何使用 Flash (AS3) 从远程域调用 Flex SWF?
【发布时间】:2010-09-06 01:46:33
【问题描述】:

我在 http://www.a.com/a.swf 上托管了一个 Flex swf。 我在另一个尝试加载 SWF 的域上有一个 flash 代码:

_loader = new Loader();
var req:URLRequest = new URLRequest("http://services.nuconomy.com/n.swf");
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderFinish);
_loader.load(req);

在 onLoaderFinish 事件中,我尝试从远程 SWF 加载类并创建它们:

_loader.contentLoaderInfo.applicationDomain.getDefinition("someClassName") as Class

当这段代码运行时,我得到以下异常

SecurityError: Error #2119: Security sandbox violation: caller http://localhost.service:1234/flashTest/Main.swf cannot access LoaderInfo.applicationDomain owned by http://www.b.com/b.swf.
    at flash.display::LoaderInfo/get applicationDomain()
    at NuconomyLoader/onLoaderFinish()

有什么方法可以让这段代码正常工作吗?

【问题讨论】:

    标签: apache-flex flash actionscript-3 security


    【解决方案1】:

    这一切都在第 550 页的The Adobe Flex 3 Programming ActionScript 3 PDF 中进行了描述(第 27 章:Flash Player 安全性/跨脚本):

    如果两个使用 ActionScript 3.0 编写的 SWF 文件来自不同的域(例如,http://siteA.com/swfA.swfhttp://siteB.com/swfB.swf),则默认情况下,Flash Player 不允许 swfA.swf 编写 swfB.swf 的脚本,也不允许 swfB。 swf 脚本 swfA.swf。 SWF 文件通过调用 Security.allowDomain() 授予对来自其他域的 SWF 文件的权限。通过调用 Security.allowDomain("siteA.com"),swfB.swf 授予来自 siteA.com 的 SWF 文件编写脚本的权限。

    它更详细地进行了,包括图表和所有内容。

    【讨论】:

      【解决方案2】:

      您需要在服务器上有一个 crossdomain.xml 策略文件,该文件包含您加载的文件,它应该看起来像这样:

      <?xml version="1.0"?>
      <!-- http://www.foo.com/crossdomain.xml -->
      <cross-domain-policy>
        <allow-access-from domain="www.friendOfFoo.com" />
        <allow-access-from domain="*.foo.com" />
        <allow-access-from domain="105.216.0.40" />
      </cross-domain-policy>
      

      将它作为 crossdomain.xml 放在您要从中加载的域的根目录中。

      你还需要设置加载器来读取这个文件:

      var loaderContext:LoaderContext = new LoaderContext();
      loaderContext.checkPolicyFile = true;
      
      var loader:Loader = new Loader();
      loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onComplete );
      loader.load( new URLRequest( "http://my.domain.com/image.png" ), loaderContext );
      

      来自http://blog.log2e.com/2008/08/15/when-a-cross-domain-policy-file-is-not-enough/的代码示例

      【讨论】:

        【解决方案3】:

        也许System.Security.allowDomain 是你需要的?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-22
          • 1970-01-01
          • 1970-01-01
          • 2017-06-04
          • 1970-01-01
          • 2012-02-08
          • 2014-04-21
          • 2012-01-19
          相关资源
          最近更新 更多