[AS3]swf如何和网页通信?附解决安全沙箱方法
如果我们只是做一个单机版的swf,与世隔绝,那么完全不会接触到接下来我们要说的这么多东西。。。可见提高对你项目的要求是使你学习更多知识的方法。
最常见的,我们有这样一个主swf(为了简单说明,再假设只有这么一个swf),另外我们有很多资源:jpg,png,xml,txt,swf等等,我们将之放在一个文件夹Resource下,然后将Resource和主swf放在同一个目录下,然后我们通过这个swf加载、访问这些资源,我们发现,非常没有问题。
然而,当我们最终需要将这个swf放在网页上,并且将那些资源都放在网页上,那么他们最好还是跟本地一样的文件结构存放,但是我们知道,网页上的swf肯定不会自己跑出来显示,肯定是要网页来加载他,在网页中通过"***.swf?p=...&p2=.."这样的方式来调用这个swf和传参数。如果这个网页也是和swf放在同一个文件夹下,那也是没问题的。可是我们有可能会有很多这样的网页,都放在一个文件夹很难管理,于是我们将他们放在不同的文件,这就会导致这样的问题:A网页是放在"../1/2/A",B网页是"../5/5/B",那么URLRequest的默认路径是哪个呢?是主swf所在的位置么?错,其实是看具体调用它的网页的地址,例如A调用时,URLRequest默认路径是"../1/2/",这样的话,如果我们URLRequest()时只会在A或B下面找,而不会在swf所在的目录中找,自然找不到。所以我们的做法是:获得主swf的绝对路径,将之作为URLRequest的路径。要想获得该swf的绝对路径,可以这样:test = stage.loaderInfo.url; 另外我们要将文件名去掉:
test .slice(0,test.lastIndexOf("/")+1);理论上这在本机上也行得通,但是实际上是:显示安全沙箱出错或者是加载资源出错。为什么呢?
看看这个例子就知道了:
在本机上,我们运行swf,得到的test的值为file:///C://test/test.swf,路径也就是file:///C://test/
在本机上,我们运行同个目录下的html文件,发现沙箱问题、加载问题等等问题,test的值是file://C:\test\,这就难怪他找不到了
于是我们要改成:
test .slice(0,test.lastIndexOf("\\")+1); 注意,前面的\只是转义字符,实际上就是让路径遇到最后一个"\"时截止。这样的话按道理本机运行swf会有问题,但是实际上却是没有问题。。。
由于之前这个问题一直缠绕着我,导致我将它和安全沙箱问题混淆了,以为安全沙箱是多么恐怖的事情。
其实安全沙箱很简单:
当两个不同文件夹下面的文件(这两个文件至少一个是swf)要通信时,会出现安全沙箱问题。可用下面的任意一个方法解决:
1.在swf里面通过Security.allowDomain("另一个文件的地址和名字");
2.在另一个文件所在文件夹下建一个crossdomain.xml,里面写上:
<cross-domain-policy><allow-access-from domain="允许访问的对方的地址和名字" /></cross-domain-policy>
3.如果这两个文件中一个是网页的话,可以在网页调用swf的标签处加上:allowScriptAccess="允许访问的对方的地址和名字"
4.万不得已、仅在平时调试时:在C:\windows\system32\Macromed\Flash\FlashPlayerTrust 下面,新建一个随便的txt文件,里面将你要设置为同个域的文件名(包括路径),每个一行写在里面,然后将文件改后缀为.cfg(其实txt应该也没问题)。
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例