【问题标题】:How to fix this (probably) cross domain policy error using Flash, Socket.IO and NodeJS如何使用 Flash、Socket.IO 和 NodeJS 修复这个(可能)跨域策略错误
【发布时间】:2012-12-15 03:08:16
【问题描述】:
Error #2044: Unhandled SecurityErrorEvent:. text=Error #2048: Security sandbox violation: http://kipos.bluecodestudio.com/holdthebomb/HoldTheBombWeb.swf cannot load data from http://23.29.126.76:8000/socket.io/1/?t=1356891827452.
    at io::Socket/doHandshake()[/Users/airrider3/github/AS3-Socket.IO-XHR-Polling/xhr-polling/src/io/Socket.as:139]
    at io::Socket/connect()[/Users/airrider3/github/AS3-Socket.IO-XHR-Polling/xhr-polling/src/io/Socket.as:110]
    at io::Socket()[/Users/airrider3/github/AS3-Socket.IO-XHR-Polling/xhr-polling/src/io/Socket.as:90]
    at io::IO$/connect()[/Users/airrider3/github/AS3-Socket.IO-XHR-Polling/xhr-polling/src/io/IO.as:36]
    at MainController/endOfbluecodeSplash()[/Users/airrider3/Dropbox/Projects/Kipos/Minigames/HoldTheBombWeb/src/MainController.as:41]
    at bluecodeSplash/endOfSplash()[/Users/airrider3/Dropbox/Projects/Kipos/Minigames/HoldTheBombWeb/src/bluecodeSplash.as:55]
    at Function/http://adobe.com/AS3/2006/builtin::apply()
    at com.greensock.core::TweenCore/complete()[D:\_Flash\_AS3\src\com\greensock\core\TweenCore.as:178]
    at com.greensock::TweenLite/renderTime()[D:\_Flash\_AS3\src\com\greensock\TweenLite.as:477]
    at com.greensock.core::SimpleTimeline/renderTime()[D:\_Flash\_AS3\src\com\greensock\core\SimpleTimeline.as:93]
    at com.greensock::TweenLite$/updateAll()[D:\_Flash\_AS3\src\com\greensock\TweenLite.as:642]

我正在使用 Flash Builder,这是一个 ActionScript 项目,它使用 Socket.IO 模块连接到运行 NodeJS 的服务器。

要将 Socket.IO 与 AS3 连接,我使用以下库 https://github.com/sbquinlan/AS3-Socket.IO-XHR-Polling 从 Flash Builder 在本地测试时完美运行。

但是,如果托管在我的 domain [http://kipos.bluecodestudio.com/holdthebomb/] 上,我想它会引发此 SecurityErrorEvent,因为我没有正确使用任何 crossdomain.xml 文件?老实说,我从来没有与这个话题相处过,所以我不确定这是否是错误。

无论如何,我有以下 crossdomain.xml 文件:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <site-control permitted-cross-domain-policies="master-only"/>
   <allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>

我在服务器上的不同位置都有它。 (应该在托管客户端上吗?)。是的,游戏托管在 bluecodestudio.com 上,而游戏的服务器在 IP 23.29.126.76 上,在端口 8000 上运行。

如果是跨域策略错误的情况,是否有人愿意解释应该采取什么措施来解决问题?

感谢您的关注。

更新 1:

我设置了一个监听 843 端口的服务器来提供跨域文件,但我可以看到 Flash 没有尝试加载它。 (我测试了命令python -c 'print "&lt;policy-file-request/&gt;%c" % 0' | nc 23.29.126.76 843 并检查了策略服务器的工作原理。

为什么 SWF 不尝试加载跨域策略文件?

【问题讨论】:

    标签: actionscript-3 node.js cross-domain socket.io


    【解决方案1】:

    跨域策略文件应托管在运行服务器的机器上,即 23.29.126.76 上。对于套接字连接,Flash 播放器会自动尝试从端口 843 加载主跨域策略文件(您可以从 adobe.com http://www.adobe.com/cn/devnet/flashplayer/articles/socket_policy_files.html 获取简单的策略服务器脚本)

    更新: 使用Security.loadPolicyFile("xmlsocket://23.29.126.76:843"); 直接加载策略文件,但正如我编写的flash player 已经自动执行相同操作(对于端口843),它发送字符串请求"&lt;policy-file-request/&gt;\0"

    调试策略

    要调试策略服务器,请执行以下操作:

    1. 确保您拥有debug flash player

    2. 通过以下命令(Linux、mac 或 Windows 上的 cygwin)检查服务器安装是否正确:echo -ne '&lt;policy-file-request/&gt;\0' | nc -v host port。这个命令应该打印出你的 crossdomain.xml 文件

    3. 通过在mm.cfg文件中设置标志PolicyFileLog=1打开flash播放器策略日志(确保你有flash播放器的debug version),运行swf文件并读取策略日志,它有用户友好的格式,您将能够在大多数情况下通过此日志找出问题。

    【讨论】:

    • 谢谢。我能够在我的服务器上正确设置 flashpolicy 服务器,并且我使用给定的命令测试了它是否正常工作。
    • 我使用 Security.loadPolicyFile("23.29.126.76:843"); 直接加载策略文件。但是,我收到以下错误: Connection from ::ffff:88.8.71.155:55884 Unrecognized request from : :ffff:88.8.71.155:55884: GET / HTTP/1.1 Host: 23.29.126.76:843 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) [...] 就像发出请求的字符串是'不承认。
    • 哦,愚蠢的我。该请求是“GET / HTTP/1.1”,因为它试图直接访问该文件。我想我可以给它一个正确的链接来解决它,但我仍然不明白为什么它不尝试从端口 843 的服务器获取 .xml,或者我是否必须在 AS3 中执行一个函数才能使它试试看?
    • 给它一个直接链接不起作用,它也不会尝试从 843 加载策略文件...
    • 感谢您更新您的答案。我已经使用您提供的命令来检查策略服务器是否设置正确,并且确实如此。正如我在终端上看到的那样,Flash 不会自动请求端口 843 上的文件,这对我来说似乎很奇怪,因为我到处都在阅读它应该尝试从那里获取它的地方。
    【解决方案2】:

    哇哦。我刚刚在 Socket.IO 文档上阅读了这个: "闪存策略端口默认为 10843

    默认情况下,Socket.IO 客户端将检查服务器上的端口 10843 以查看是否允许 flashsocket 连接。 Adobe Flash Player 通常使用 843 作为默认端口,但我们决定默认为非根端口。”

    所以这就是它没有尝试从端口 843 加载文件的原因...

    来源:https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2013-04-16
      • 2010-11-23
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 2012-12-10
      相关资源
      最近更新 更多