我很茫然。我无法弄清楚为什么Flash没有正确加载我的策略文件。我正在从Flash调试器中测试它。
I've also tried from http://127.0.0.1:80/game (it sends a request to http://127.0.0.1:3014/socket.io/1/).
Security.loadPolicyFile('xmlsocket://127.0.0.1:843'); var r:URLRequest = new URLRequest(); r.url = httpProtocal+"://" + domain + "/socket.io/1/?time=" + new Date().getTime(); r.method = URLRequestMethod.POST; var ul:URLLoader = new URLLoader(r); ul.addEventListener(Event.COMPLETE, onDiscover); ul.addEventListener(HTTPStatusEvent.HTTP_STATUS, onDiscoverError); ul.addEventListener(IOErrorEvent.IO_ERROR , onDiscoverError);
错误:
> webSocketLog: policy file: xmlsocket://127.0.0.1:843 Error #2044:
> Unhandled securityError:. text=Error #2048: Security sandbox
> violation: file:///ude/game/bin-release/Game.swf cannot load data from
> http://127.0.0.1:3014/socket.io/1/?time=1359025067289. at
> com.pnwrain.flashsocket::FlashSocket()
然而这有效:
> echo -ne '<policy-file-request/>\0' | nc -v 127.0.0.1 843
Connection to 127.0.0.1 843 port [tcp/*] succeeded!
<?xml version='1.0' ?>
<!DOCTYPE cross-domain-policy SYSTEM 'http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd'>
<cross-domain-policy>
<allow-access-from domain='*' to-ports='*' />
</cross-domain-policy>
指定crossdomain.xml的绝对路径也不起作用。我可以在浏览器中加载这个文件。
> webSocketLog: policy file: http://127.0.0.1:843/crossdomain.xml
> Error #2044: Unhandled securityError:. text=Error #2048: Security
> sandbox violation: file:///ude/game/bin-release/Game.swf cannot load
> data from http://127.0.0.1:3014/socket.io/1/?time=1359025126138. at
> com.pnwrain.flashsocket::FlashSocket()
这甚至不起作用(来自非常受欢迎的博客文章的解决方案):
import flash.system.Security;
Security.allowDomain("http://127.0.0.1");
这是调试器策略文件日志:
> OK: Root-level SWF loaded:
> file:///ude/game/bin-release/Game.swf
> OK: Searching for <allow-access-from> in policy files to authorize
> data loading from resource at
> http://127.0.0.1:3014/socket.io/1/?time=1359026453454 by requestor
> from
> file:///ude/game/bin-release/Game.swf
> Error: [strict] Ignoring policy file at
> http://127.0.0.1:3014/crossdomain.xml due to missing Content-Type.
> See http://www.adobe.com/go/strict_policy_files to fix this problem.
> Error: Request for resource at
> http://127.0.0.1:3014/socket.io/1/?time=1359026453454 by requestor
> from
> file:///ude/game/bin-release/Game.swf
> is denied due to lack of policy file permissions. Warning: HTTP
> response headers not available on this platform. Strict policy file
> rules cannot be enforced. OK: Policy file accepted:
> http://127.0.0.1:843/crossdomain.xml
这里有趣的部分是OK: Policy file accepted
消息出现在错误之后,即使我正在呼叫:
Security.loadPolicyFile('http://127.0.0.1:843/crossdomain.xml');
在URLRequest
之前。所以我将URLRequest
移动到了setTimeout,现在日志说:
> OK: Root-level SWF loaded:
> file:///ude/game/bin-release/Game.swf
> Warning: HTTP response headers not available on this platform. Strict
> policy file rules cannot be enforced. OK: Policy file accepted:
> http://127.0.0.1:843/crossdomain.xml OK: Searching for
> <allow-access-from> in policy files to authorize data loading from
> resource at http://127.0.0.1:3014/socket.io/1/?time=1359028255268 by
> requestor from
> file:///ude/game/bin-release/Game.swf
> Error: [strict] Ignoring policy file at
> http://127.0.0.1:3014/crossdomain.xml due to missing Content-Type.
> See http://www.adobe.com/go/strict_policy_files to fix this problem.
因此,它似乎已经加载了843策略文件,但是然后尝试加载端口3014策略文件(可能检查子策略文件?)。这只是一个socket.io HTML页面,上面写着'Welcome to socket.io'。它似乎不应该因为那个原因而失败。
我在调试器警报中得到了这个:
Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: file:///ude/game/bin-release/Game.swf cannot load data from http://127.0.0.1:3014/socket.io/1/?time=1359028255268.
at MethodInfo-3642()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at SetIntervalTimer/onTimer()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()
任何想法都非常感激。谢谢!
答案 0 :(得分:1)
我不是专业的政策文件,但这看起来很可疑:
错误: [严格] 忽略政策文件 由于缺少内容类型,因此
http://127.0.0.1:3014/crossdomain.xml
。 请参阅http://www.adobe.com/go/strict_policy_files以解决此问题。
似乎忽略了策略文件,因为它没有或无效的Content-Type标头。
来自Adobe:
从版本9,0,115,0开始,Flash Player将忽略未使用Content-Type值发送的任何HTTP策略文件,该值可确保该文件旨在成为文本文件。 Flash Player要求策略文件的Content-Type必须是以下之一:
text/* (any text type)
application/xml
或application/xhtml+xml
而且:
如果您发现需要解决内容类型问题,请务必参阅meta-policies部分,因为选择元策略的一种常用方法是指定特殊的内容类型
text/x-cross-domain-policy
用于所有策略文件,可以同时解决两个问题 - 建立元策略并提供文本内容类型。
同时检查服务器为什么HTTP响应标头不可用:
警告:此平台上的HTTP 响应标头不可用。严格 政策文件规则无法执行。
希望这有帮助。
答案 1 :(得分:0)
成功连接和策略验证的关键是:
1)在与socket.io脚本相同的文件夹中放置一个crossdomain.xml文件。
2)在运行socket.io服务器的同一主机:port中通过http提供此crossdomain.xml。
3)要实现这一点,您需要安装除socket.io之外的快速框架。使用express和socket.io,您可以在同一端口上同时通过http和连接套接字提供crossdomain.xml。
4)使用此方法,flash可以在最初寻找此策略文件的位置(相同的主机:端口)中找到crossdomain.xml,从而无需手动从Flash加载策略文件(可以禁用loadPolicyFile)
会是这样的:
var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
app.get('/crossdomain.xml', function (req, res) {
console.log("request ... " + __dirname);
res.sendfile(__dirname + '/crossdomain.xml');
});
server.listen(port, "ip");
console.log("socket.io server started");