Flash策略文件不起作用(相同域,不同端口)

时间:2013-01-24 12:11:11

标签: flash cross-domain-policy

我很茫然。我无法弄清楚为什么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()

任何想法都非常感激。谢谢!

2 个答案:

答案 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/xmlapplication/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");