加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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>";    //xml表头可以写也可以不写,后边是必须的

            pw.write(bd);
            pw.flush();

        } catch (IOException ex) {
            Logger.getLogger(Csocket.class.getName()).log(Level.SEVERE,null,ex);
        }

    }
}
马上根据这个在同事那边用java写了一个843端口监听,结果 ?哈哈成功了

于是服务端那边就不用改了,在开一843端口的监听,他那边代码我没有,所以就不贴了,跟上面意思差不多,也是返回那个xml串

注意下后面哪个,这个是flash这边要用的。还有就是843端口发送完之后,要断开连接

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读