用过Flash socket的同学都知道。Flash socket通讯有安全沙箱问题。就是在Flash Player发起socket通信时。会向服务端获取安全策略,假设得不到服务端响应,flash将无法连接到服务端。
首先。什么是Flash安全沙箱?
Flash安全沙箱是Flash Socket的一种安全策略。为避免随意Flash终端与目标主机建立Socket通讯,以授权port,域名方式限定连接。
那么。Flash Player怎么获取Socket策略?
Flash Player发起socket通信请求的时候会先连接server端的843port,获取Socket策略。当server没有开启843port的时候。Flash Player会检查发起请求的flash程序中有没有使用Security.loadPolicyFile来载入Socket策略,假设还是没有就会看这个发起请求的连接的目标port有没有Socket策略。
假设都没有,那么Flash Player将触发连接失败的Socket事件,即SecurityErrorEvent.SECURITY_ERROR。
备注一下,Security.loadPolicyFile的使用方法为:Security.loadPolicyFile("xmlsocket://127.0.0.1:8080");
再来看看Socket策略的格式
1、下面是最简单的Socket策略。就是不做不论什么限制的:
<cross-domain-policy> <allow-access-from domain="*" to-ports="*"/> </cross-domain-policy>
2、假设要限制某个域名或者ip。能够这样写:
<cross-domain-policy> <allow-access-from domain="*.example.com" /> <allow-access-from domain="192.168.5.110" /> </cross-domain-policy>
3、限制端口能够这样定义:
<cross-domain-policy> <allow-access-from domain="*" to-ports="507" /> <allow-access-from domain="*.example.com" to-ports="507,516" /> <allow-access-from domain="*.example.com" to-ports="516-523" /> <allow-access-from domain="www.example.com" to-ports="507,516-523" /> </cross-domain-policy>
4、完整的socket策略要怎么定义?
看一下这个演示样例:
<? 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="swf.example.com" to-ports="123,456-458" /> </cross-domain-policy>
当中,site-control告诉Flash Player,服务端支持哪种socket策略。设为master-only表示这个策略是服务端唯一的策略,Flash Player不要去支持服务端其它socket策略。还能够设为all和none。all表示全部端口的策略都是可信的,none是拒绝全部连接。
最后。再来看下Flash Player获取Socket策略时发什么请求信息给服务端?
Flash Player发起socket连接请求会向服务端发23字节的字符数据:<policy-file-request/>
细心的同学会观察到,<policy-file-request/>仅仅有22字节。怎么还多了1个字节呢?
这里有一点要注意,<policy-file-request/>后面还多带了一个NULL 的字节数据。
參考:
http://blog.csdn.net/mycwq/article/details/24675773
http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html