微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于Flex安全沙箱问题的解决

现象:

flex工程运行,直接访问本地swf文件正常,可以打开wms服务,可以连接webapps\dbserver,获取数据库内容

但是swf放到geoserver的webapps\geoserver下后,通过网页http访问,报安全沙箱故障。


解决

由于根本没有牵涉到访问其他物理地址的服务器,仅仅是本机geoserver下的两个工程,应该不存在所谓的跨域访问问题。

偶然发现网页内输入的是:http://192.168.0.168:8080/geoserver/test_scale.swf,而swf内访问wms服务使用的是:http://localhost:8080/geoserver/....

因此,两者域名不同,肯定导致出现安全沙箱问题。

网页中输入:http://localhost:8080/geoserver/test_scale.swf后,地图服务就可以打开了。



另外,附搜寻到的解决安全沙箱的资料,以后可备用:


FLEX 安全沙箱 faultDetail=“Channel.Security.Error error Error #2048:
2013-04-13

近日有朋友遇到的问题,帮忙解决时搜到的

 

今日犯了个低级错误,因为之前没有遇到过 所以没有在意   本地项目运行完全没问题  发布到服务器上居然报错,错误内容大致如下:

[RPC Fault faultString="发送失败" faultCode="Client.Error.MessageSend" faultDetail="Channel.Security.Error error Error #2048: 安全沙箱冲突:http://127.0.0.1:8080/WL/ReportNew.swf 不能从 http://localhost:37813/WL/messagebroker/amf?hostport=127.0.0.1:8080&https=N&id=-1 加载数据。 url: 'http://127.0.0.1:8080/WL/messagebroker/amf'"]

 

一开始以为是跨域传输的问题 ,拼命的调试,网上拼命的搜索。实在折腾够呛 到下午都没解决  同事又急需调试~~  哎~跳楼的心都有,

跑GOOGLE上搜了一把  看到一篇老外的文章  说是跟 网络监视器有关~~  把网络监视器关掉 重新编译 再次发布 居然神奇的可以了~~

哎。。总算是解决了 ,希望大家注意!



关于Flex安全沙箱问题的解决 分类: Flex 2009-02-04 17:27 7351人阅读 评论(0) 收藏 举报 flexsocket服务器xmlstringdomain 最近遇到了flex 的安全沙箱问题,找了很多资料发现不是都是和我,我的程序需要socket连接,而大多数讲的都是跨域文件读取的。我先把两种方法都总结出来: 跨域文件读取 方法一:在目标服务器上布署crossdomain.xml文件(我用的此方法很管用,放上就没问题了) 需要远程服务根目录定义有crossdomain.xml文件,如下: <?xml version="1.0" encoding="UTF-8" ?> <cross-domain-policy>     <allow-access-from domain="*"/> </cross-domain-policy> 方法二:使用代理,把Flex要访问的远程文件通过asp,PHP,jsp等脚本读取到本地,然后再由Flex去访问; 方法三:使用Adobe flash player 9 打开程序后,点击菜单栏中文件->创建播放器...即生成exe文件,运行exe文件即可突破安全限制; 方法四:     1、找到这个文件夹:c:/Documents and Settings/<UserName>/Application         Data/Macromedia/Flash Player/#Security     2、在其下建立一个名为"FlashPlayerTrust"的文件夹     3、在"FlashPlayerTrust"文件夹下新建一TXT文件内容如下:         c:/         d:/         e:/         f:/     4、将该txt文件命名为:"myTrustFiles.cfg"     再打开你硬盘里的SWF文件,就不会出现那个烦人的安全设置提示窗口了! 方法五: 用HttpService它认是有Proxy的,需要配置flex-config.xml,里面有一段: <http-service-proxy>      <whitelist>         ………………     </whitelist> </http-service-proxy> 这个是白名单,一般情况下是注释掉的,也就是认只有本地的http://{localserver}/*和https://{localserver}/*可以访问。其他的需要在flex-config.xml里的自行修改成需要的就可以了。 访问本地自然不会跨域,不过你肯定访问局域网其他机器了,所以是依照白名单规则,属于跨域   Socket沙箱问题 在Flex中使用Socket进行通信时,也会受到Flash9的新安全策略的困扰. 解决方法不能像在Web服务器中布置一个crossdomain.xml来解决,或是在服务器上专门开启843端口来提供安全策略. 有一种方法就是在接收到客户端的连接后,向其发送 安全策略. 比如我是用JAVA来开发,客户端的Flex会先搜索同域,及服务器的843口,看是否能得到安全策略,这时候Socket是先建立好的,可以在接收到Socket,即Accept事件发生是,马上向其发送 策略串,否则客户端就会因为安全策略不过关,于断开,如果成功获取策略,则客户端将断掉先前的那次Socket,再真正进行程序中你要求的Socket连接请求. 下面看看我找的例子吧! public void run() { ServerSocket ss; String ip = ""; try { ip = InetAddress.getLocalHost().getHostAddress(); } catch (UnkNownHostException e1) { e1.printstacktrace(); } String xml = "<cross-domain-policy><site-control permitted-cross-domain-policies=/"all/"/>"; xml = xml + "<allow-access-from domain=/"" + ip + "/" to-ports=/"1234/" />"; xml = xml + "</cross-domain-policy>"; try { ss = new ServerSocket(port); while (!cancle) { Socket s = ss.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(s .getInputStream(),"UTF-8")); PrintWriter pw = new PrintWriter(s.getoutputStream()); char[] by = new char[22]; br.read(by,22); String head = new String(by);                                      //判断是不是第一求请求连接的安全验证,当客户端连socket时,as3会自动向服务端发送<policy-file-request/>这个字符串请求返回策略文件,所以当服务器收到这个串后给client返回就好了。                                            //如果是返回xML信息 if (head.equals("<policy-file-request/>")) { System.out.println("连接服务器"); pw.print(xml + "/0"); pw.flush(); br.close(); pw.close(); } else {                //你自己的正常请求处理逻辑 } } ss.close(); } catch (IOException e) { e.printstacktrace(); } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐