注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

享受编码

    的乐趣

 
 
 

日志

 
 

Flex 安全沙箱问题  

2011-07-29 23:05:17|  分类: Flex & as3 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
问题1:URL访问、数据上传下载、BlazDS访问、WebService、HttpService遇到安全沙箱问题;
通常遇到安全啥想问题,要访问的网站下面要放一个crossdomain.xml来解决,内容是:
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" secure="false" />
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>
并且Flex代码中添加:
Security.allowDomain("*");
Security.loadPolicyFile(http://domain/crossdomain.xml);

问题2:Socket通信链接类的遇到的安全沙箱问题;
当做具有socket服务器的flash社区或者游戏时,牵涉到flash的安全策略的问题,
如果没有通过安全策略的检验,socket时连接不成功.
解决这个问题的办法有几种,看具体的情况.一种时加载一个与flash所在位置相同的flash,该flash连接服务器
另外的一种时连接上服务器后,接受服务器的策略文件,通过再继续通讯.具体可以参考官方的flash.system.Security类
下面我列出我写的解决程序,我是直接把配置文件写进服务器里(主要这里时做个例子,简单起见,事实上服务器去读xml都可以)

现看下服务端全部代码:
import java.net.Socket;
import java.net.ServerSocket;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class XMLServer {
        public void start() throws Exception{
                String xml = "<cross-domain-policy>";
                xml = xml + "<allow-access-from domain=\"127.0.0.1\" to-ports=\"5000,8080\" />";
                xml = xml + "<allow-access-from domain=\"localhost\" to-ports=\"5000,8080\" />";
                xml = xml + "</cross-domain-policy>";
                //端口可以是843,或者是你提供服务的端口,这里使用服务端口
                //实际上Flash是先访问843再请求服务端口,所以这里如果单独开一个线程在843上可以让Flash的认证速度快一些
                ServerSocket serverSocket = new ServerSocket(5000);
                while(true){
                        try {
                                //新建一个连接
                                Socket socket = serverSocket.accept();
                                System.out.println("连接成功......");
                                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                                PrintWriter pw = new PrintWriter(socket.getOutputStream());
                                //接收用户名
                                char[] by = new char[22];
                                br.read(by,0,22);
                                String head = new String(by);
                                System.out.println("消息头:" + head + ":");
                                //这里是根据客户端第一次传过来的字符串进行判断,是安全策略请求还是服务协议请求
                                if(head.equals("<policy-file-request/>")){
                                        pw.print(xml + "\0");//flash遇到\0认为接收结束,如果不是\0 flash会一直继续等待接收
                                        pw.flush();
                                } else {
                                        ServerThread thread = new ServerThread(socket);
                                        thread.start();
                                }
                        } catch (Exception e){
                                System.out.println("服务器出现异常!" + e );
                        }
                }
        }
        public static void main(String[] args){
                try{
                        new XMLServer().start();
                } catch (Exception e) {
                        System.out.println("socket异常:" + e);
                }
          
        }
}

接着看客户端部分代码
public function TestXMLSocket()
                {
                        System.useCodePage = true;
                        socket = new XMLSocket();
                        socket.addEventListener( Event.CONNECT, onConnect );
                        socket.addEventListener( IOErrorEvent.IO_ERROR , failConnect );
                        socket.addEventListener( DataEvent.DATA, onDatas );
                        sendBtn.addEventListener(MouseEvent.MOUSE_DOWN,sendEvent);
                        socket.connect("10.0.108.166", 5000); 
                }
                public function onConnect(myStatus:Event):void
                {
                        msgText.text = msgText.text + "连接成功\n";
                        //立即发送成功 信息到服务器
                        socket.send("<policy-file-xxquest/>\n");
                }
可以看到,当连接成功后,马上发送一个判断字符串
这是因为使用指定的端口建立连接后,Flash Player 立即传送 <policy-file-request />,并以 null 字节结束
服务器发送一个空字节来终止策略文件,并可以随后关闭该连接;如果服务器不关闭该连接,则 Flash Player 在收到终止 null 字节后也会这样做。
当客户端得到权限后,就会自动再次与服务器连接,接着就会响应onConnect方法了

  评论这张
 
阅读(1518)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017