在 Adobe Flash Player 升级到 9.0.124 后,由于安全策略更改,原来 Socket 或 XmlSocket 的应用里的 http 方式加载安全策略的手段不能继续使用。更改如下:
- 1, 首先检测目标服务器的 843 端口是否提供安全策略
- 2, 如果 1 没有检测到策略,则检测 actionscript 是否使用了
Security.loadPolicyFile(xmlsocket://)
手段提供安全策略,如果还没检测到,则使用第 3 步检测
- 3, 检测目标服务器目标端口是否提供安全策略。
在说具体处理方式前,我先描述一下 Flash Player 的验证过程。在 Flex 程序发出 Socket 或 XmlSocket( 以下统称为 Socket) 请求前, FlashPlayer 会先判断是否为本地调用,如果不是。即用一个 Socket 去链接到你的服务端,三次握手成功后一方面发出字符串“ <policy-file-request/>/0 “另一方面监听返回的安全策略。安全策略接收成功后, FlashPlayer 就断开验证的 Socket ,然后再运行程序本身的 Socket 。在整个 SWF 运行期间,无论你请求多少次,只要域相同, FlashPlayer 就只验证一次。这里有两个重点:
- 第一个是验证的 Socket 和程序的 Socket 是两个 Socket 。所以你在本地测试时,服务端监听到 N 个 Socket 请求,但布置到服务端后,服务端会监听到 N+1 个请求。
- 第二是验证的 Socket 发送“ <policy-file-request/>/0 “请求和接收你的策略文件是没有先后关系的,所以你没必要接收完“ <policy-file-request/>/0 “后才发策略文件。我的做法是只要监听到请求,就把策略字符串发过去。
上面提供了三种方式处理安全策略。其实处理的办法差不多一样,就是要求服务端监听一个端口,如果客户端发来“ <policy-file-request/>/0 “请求,服务端就要返回你的安全策略的字符串。
其实三种处理方式的主要区别在于监听端口,方法 1 和 2 要求在另外的端口监听,而第三个即在应用本身监听的端口监听。其实监听端口的数量多一个不如少一个。在虚拟空间中不说了,端口不是说要监听就监听的,要有权限。就算有权限监听,还要防火墙同意。所以我比较偏向于第三种。
在 HIM 中,我处理的代码如下:
- protocol.sendStringToSingleClient(protocol.getUser(), "<?xml version=/"1.0/"?><cross-domain-policy><site-control permitted-cross-domain-policies=/"all/"/><allow-access-from domain=/"*/" to-ports=/"*/"/></cross-domain-policy>/0");
protocol.sendStringToSingleClient(protocol.getUser(), "<?xml version=/"1.0/"?><cross-domain-policy><site-control permitted-cross-domain-policies=/"all/"/><allow-access-from domain=/"*/" to-ports=/"*/"/></cross-domain-policy>/0");
这里的 protocol .sendStringToSingleClient 是我自已封装的方法,作用是把字符串发到指定的 socket 。这个方法不是重点,重点是方法参数中的表示策略文件的 xml 字符串和后面的 ”/0” 。我的 xml 字符串意思是允许所有域仿问,具体字段的意思可以参考:
http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html
,细节我不说了。另外,一定要注意 xml 字符串后面的 ”/0” ,因为 Flash Player 是用他来做分隔符的,如果你不加上,客户端验证 socket 可能就一直等待。