当前位置: 移动技术网 > IT编程>UI设计>设计软件 > flex的Socket通讯沙箱和安全策略问题

flex的Socket通讯沙箱和安全策略问题

2019年03月20日  | 移动技术网IT编程  | 我要评论

马修曼,中国好声音mp3打包下载,平南新闻

一、沙箱和安全策略问题
    1、此问题发生在连接时,准确地说是连接前,分别两种情况:
        1.本地播放
   本地播放时,默认情况下flash player将不允许swf访问任何网络。
   访问http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html,将swf加入到许可列表,即可解除限制。
    2.web发布
   发布在web上的swf, 将可能面临跨域的问题。
    2、flash中的通信方式有两种:
1.http方式:如urlloader等用于加载远程swf、文件、图像、音视频流。
2.socket主要:如 xmlsocket,用于与远程服务端建立长效连接。
flash player6以上版本引入了安全策略文件,在进行正式的通信前,会检查目标位置是否存在合法的安全策略,以防止不同域内的应用无限制任意互访。
http方式下,flash player会检查目标域根目录下是否存在crossdomain.xml,如果有,则获取并分析其内容(内容后述)以确定是否允许继续访问。
socket方式下,flash player获取安全策略稍微复杂些,从9.0.115.0版起,标准步骤如下(以下描述以ie为标准,例外情况后述):
1)首先向目标主机 843 端口发起连接,并发送一个字符串,内容为"",并等待返回安全策略文件并分析。
2)若1)失败,则检查as代码中是否使用了security.loadpolicyfile("xmlsocket://主机:端口")方法加载安全策略文件,若有,则获取并分析。
3)若2)失败,则向as代码中即将连接的 "目标主机:端口" 发起请求,过程同1)。
4)若成功获得安全策略文件并经分析认为允许建立连接,则继续执行connect()方法,此时方真正尝试创建与目标主机的连接。
  3、解决方案
http 连接方式不用再说,只说说 socket 方式。
1) 在服务端写一个程序,监听843端口,当收到 "" 时将恰当的策略内容(crossdomain.xml)发送回客户端。
2) 在as中通过loadpolicyfile()加载策略文件,此处需注意使用xmlsocket://,而不是 http://。
3) 在标准服务端口中,检测到""时,返回策略内容。
  4、例外情况及测试结果
经测试发现,在ie,opera中,flash player会严格按上述步骤检查安全策略。
在 firefox, chrome中发起连接时,flash player并不会向服务端发送"",而是直接连接成功。这应该是flash player不同实现版本的原因。
    5、数据传输中的问题
   在xmlsocket数据传输中,需要注意以下细节,否则会出来些莫名其妙的问题。
       1.结束符号
xmlsocket接收到服务端下发的数据时,将连续放于接收缓冲区,直到接收到"\0"字节(字节内容为ascii值0),才认为接收完成,并调用相应的ondata或onxml事件。
服务端若用java编写,并使用标准的string类族,则在发送数据结尾应手动加上"\0"。
若用 c++ 编写,由于c++中标准字符串类型便是以字节0作结束标记,故不必再加"\0"。
* c++中需注意另一个问题,若自行进行了字符串处理,在决定字符串长度时,标准的strlen及string.length()等返回的均是实际有效字符个数,最终向网络发送时,总长度应加1字节,以容纳结尾的字节0。
* 此问题在发送安全策略内容时同样存在,故需重视。
       2.中文问题
默认情况下,不管从哪一端发向另一端的数据,若包含了中文字符,都会产生乱码的现象,解决方法有二:
1).在as中加入"system.usecodepage=true;" 强制使用本地代码集,此法最方便,但是在跨语种平台上仍会出现乱码。
2).在代码中自行编写转码函数,此法复杂些,但通用性强。具体转码算法网上很多,主要是c++服务端需要,java中使用jdk类转换为utf-8即可。





如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网