flash与js跨域调用

flash与js跨域调用

之前用aflax调用网页js一直比较正常,今天将aflax移到另一个域名下再调用原来域名的js发现失败了。初步判断是跨域调用的权限问题。

在FLASH脚本调用处加上参数:<param name="allowScriptAccess" value="always" />

在flash里加上:System.security.allowDomain("*");

问题得以解决。

allowScriptAccess

Flash Player 自版本 6 以来, 一直支持一个称为 allowScriptAccess 的 HTML 参数。此参数用于控制是否允许 SWF 中的 ActionScript 在包含它的 HTML 页中调用 JavaScript。 (反之则不进行控制, 即 JavaScript 调用受 System.security.allowDomain 控制的 ActionScript。)

allowScriptAccess 可能存在如下值:

  • always: 始终允许 ActionScript 调用 JavaScript
  • sameDomain: 仅当 SWF 和 HTML 页来自同一域时, 才允许 ActionScript 调用 JavaScript
  • never: 从不允许 ActionScript 调用 JavaScript

在 Flash Player 6 和 7 中, allowScriptAccess 的默认值 (如果未由 HTML 页指定) 为“always”。需要单独说明的是, 在 Flash HTML 发布模板中, allowScriptAccess 的默认值始终为“sameDomain”。如果不修改 Flash HTML 发布进程输出, 那么您将会看到“sameDomain”行为, 这是因为 HTML 页会为 Flash Player 指定“sameDomain”。

在 Flash Player 8 中, 当 Flash Player 中的主 SWF 为 7 版或更早版本时, 未指定的 allowScriptAccess 的默认值将始终为“always”, 而当主 SWF 为 8 版或更高版本时, 该默认值会变为“sameDomain”。

allowScriptAccess 参数允许 HTML 页包括 Flash 内容, 但禁止它在 HTML 页中执行脚本。当 HTML 页源自它可能并不信任的 Flash 内容时, 这一点很有用。例如, 如果您负责维护一个论坛, 其中的用户可能会包括他们自己制作的 SWF 签名, 并且生成的 HTML 将直接源自这些 SWF, 那么您可能不希望这些 SWF 能够在您的 HTML 页中执行脚本。

下面是有关如何指定 allowScriptAccess 的示例:

<objectclassid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"width="375" height="300" › <param name="movie" value="hello.swf" › <param name="allowScriptAccess" value="sameDomain" › <embedpluginspage="http://www.macromedia.com/go/getflashplayer_cn"type="application/x-shockwave-flash"src="hello.swf"width="375" height="300" allowScriptAccess="sameDomain" › </object › allowDomain

从 Flash Player 8 开始, System.security.allowDomain() 接受单个星号“*”作为通配符。调用 System.security.allowDomain("*") 的结果是允许通过所有 域而非特定域中的其它 SWF 进行脚本访问。

如果您所在的环境中没有需要保护的敏感数据, 并且您需要公开与其它域共享数据, 则使用此通配符权限会很方便。但在调用 System.security.allowDomain("*") 之前, 请确保调用 SWF 不包含需要保密或半保密的任何信息或 ActionScript 代码。调用 System.security.allowDomain("*") 后, 来自 Internet 中任意位置的任意 SWF 都可以加载您的 SWF 并对其进行脚本处理, 即便 SWF 由恶意作者编写时也是如此。

请注意, 在以下情况中, 您可能必须调用 System.security.allowDomain(), 即在运行之前, 您不知道提供协作 SWF 的域, 这可能是因为协作 SWF 由负载平衡簇提供, 或者是因为将在多个不同域中使用您的 SWF。在此情况下, 请勿盲目调用 System.security.allowDomain("*")!如上所述, 这将打开您的 SWF, 从而完全允许 Internet 上的其它任何 SWF 对其进行脚本处理。请等至协作 SWF 加载完毕, 然后使用 ActionScript property MovieClip._url 确定它的域。在将 _url 属性值传递给 System.security.allowDomain() 之后, 引用的影片剪辑中的 SWF 应该能够对调用 System.security.allowDomain() 的 SWF 进行脚本处理。

Flash Player 8 允许任意版本的 SWF 向 System.security.allowDomain() 传递“*”。但如果您要在低于 8 版的 SWF 中调用 System.security.allowDomain("*"), 那么在执行操作前, 一定要测试播放器的版本 (System.capabilities.version) 看是否至少为 8, 这是因为较早版本的 Flash Player 不会将“*”识别为 System.security.allowDomain 的参数。


另外还需要注意ActionScript代码设置:

AS2写法:System.security.allowDomain("*"); //针对不同http资源

    System.security.allowInsecureDomain("*"); //针对需要安全验证的资源

AS3写法:flash.system.Security.allowDomain("*");

   flash.system.Security.allowInsecureDomain("*");


你可能感兴趣的:(flash与js跨域调用)