Flex Socket 安全沙箱问题
发布时间:2020-12-15 03:48:29 所属栏目:百科 来源:网络整理
导读:公司是做视频监控的,我负责WEB监控端,web端是用纯FLEX写的,后台是C++,交互用Socket套接字 刚开始直接通过Flash Builder运行可以连接到Socket服务端,后来尝试着部署到tomcat,但是连不上Socket 由于在tomcat中,flex的一些日志信息根本看不到,最后网上
公司是做视频监控的,我负责WEB监控端,web端是用纯FLEX写的,后台是C++,交互用Socket套接字 刚开始直接通过Flash Builder运行可以连接到Socket服务端,后来尝试着部署到tomcat,但是连不上Socket 由于在tomcat中,flex的一些日志信息根本看不到,最后网上查了下,原来是安全沙箱的问题,由于初学flex,很多不懂 经过一上午找资料,加上和服务端的同事联调,终于搞定了,就是那所谓的9秒的安全策略机制 首先找到的方法就是说在服务端HTTP根目录下放一个crossdomain.xml文件 <?xml version="1.0"?> <cross-domain-policy> <site-control permitted-cross-domain-policies="all"/> <allow-access-from domain="*" to-ports="*" /> </cross-domain-policy> 这个好像是在服务端要有一个web服务器,感觉这个跟Socket好像搭不上边,但是后来想一下,网上都这么说了,试一下,于是在服务端搭一个tomcat服务器,在根目录下 放置这个文件,结果 当然是没用 第二个觉得可行的方法就是当服务端收到<policy-file-request/>这个数据的时候服务端返回策略串给我 String xml = "<cross-domain-policy>"; xml = xml + "<site-control permitted-cross-domain-policies='all' />"; xml = xml + "<allow-access-from domain='*' to-ports='" + SERVER_PORT + "' />"; xml = xml + "</cross-domain-policy>"; if (head.equals("<policy-file-request/>")) { pw.print(xml + " "); pw.flush(); } else { ....... ...... }这是java,在另外一同事那边运行的,这个方法是可以,欣喜若狂的跟服务端同事说,同事说服务端那边不好改,也不要混到服务端去,因为服务端不止提供给WEB端,PC端,手机端都提供,好吧,令寻办法...... 重新去整理了下flex socket 关于安全沙箱的知识 首先Flex内部会去请求你指定连接IP主机的843端口是否提供安全策略,这个耗时3秒 如果为提供,则继续检测flex中是否有这句Security.loadPolicyFile("xmlsocket://ip:端口"); 也耗时3秒 还是未提供的话,则检查主机服务端是否有返回策略文件,就是上面说到的第二种方法,耗时3秒 如果都没有,则提示安全策略错误 后来找到这篇文章 ,这篇文章大概就是再开一个843端口,专门用来给falsh发送策略文件 地址:http://ndlas.blog.163.com/blog/static/17571114020116621215469/ /* * To change this template,choose Tools | Templates * and open the template in the editor. */ package jqqq; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Administrator */ public class C843 { public static void main(String[] args) { ServerSocket ssk = null; try { ssk = new ServerSocket(843); Socket sk = ssk.accept(); PrintWriter pw = new PrintWriter(sk.getOutputStream()); BufferedReader isr = new BufferedReader(new InputStreamReader(sk.getInputStream())); String bd = "<cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy> |