AS3 air 访问远程服务器,会出现问题,如何解决,看下面

来源:互联网 发布:360浏览器java插件 编辑:程序博客网 时间:2024/05/10 01:30
本来想着flash有安全沙箱限制,访问网络上的资源会受到限制,如果没跨域策略文件,就不能访问,而AIR却可以访问。
于是我就用AIR写了一段程序来访问网上的一个flash文件:

var urlL:URLLoader = new URLLoader();

var urlR:URLRequest = new URLRequest("http://cimg3.163.com/tech/school/sunxin/vc++/12.swf");

urlL.load(urlR);

启动后发现竟然报错

ioError ,很奇怪,因为这个文件通过浏览器是可以直接访问的,但是为什么AIR加载却失败了呢?

 

于是Google、Baidu了一通,没找到什么结果。纠结了很长一段时间。

 

今天突发奇想,既然浏览器可以访问,而AIR不能访问,估计是封包的问题吧,于是我就用Fillder监控了一下请求。

两个数据包分别如下:

 

直接通过浏览器请求路径http://cimg3.163.com/tech/school/sunxin/vc++/12.swf

 

GET http://cimg3.163.com/tech/school/sunxin/vc++/12.swf HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: cimg3.163.com
Cookie: vjuids=2919b0e32.137bb9ab958.0.a5cee98eac1c; vjlast=1338882308.1339379877.11; _ntes_nnid=f4c9485efad5585cd87a1b6cce3363bc,1339379731186; _ntes_nuid=f4c9485efad5585cd87a1b6cce3363bc; P_INFO=miaofengliang2005@163.com|1339379735|0|mail163|11&18|not_found&1339377087&search#bej&null#2#0|&0; USERTRACK=202.108.36.125.1338975329984873; isGd=0; isFs=0; Province=010; City=010
 

通过AIR的URLLoader来请求http://cimg3.163.com/tech/school/sunxin/vc++/12.swf

 

GET http://cimg3.163.com/tech/school/sunxin/vc++/12.swf HTTP/1.1
Referer: app:/Test.swf
Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, text/css, image/png, image/jpeg, image/gif;q=0.8, application/x-shockwave-flash, video/mp4;q=0.9, flv-application/octet-stream;q=0.8, video/x-flv;q=0.7, audio/mp4, application/futuresplash, */*;q=0.5
x-flash-version: 10,2,153,1
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (Windows; U; zh-CN) AppleWebKit/531.9 (KHTML, like Gecko) AdobeAIR/2.6
Host: cimg3.163.com
If-Modified-Since: Mon, 08 May 2006 03:29:48 GMT
Connection: Keep-Alive
Cookie: vjuids=2919b0e32.137bb9ab958.0.a5cee98eac1c; vjlast=1338882308.1339379877.11; _ntes_nnid=f4c9485efad5585cd87a1b6cce3363bc,1339379731186; _ntes_nuid=f4c9485efad5585cd87a1b6cce3363bc; P_INFO=miaofengliang2005@163.com|1339379735|0|mail163|11&18|not_found&1339377087&search#bej&null#2#0|&0; USERTRACK=202.108.36.125.1338975329984873; isGd=0; isFs=0; Province=010; City=010
 
发现两者的最大区别在于上面的标红的地方。
如果把Referer: app:/Test.swf去掉的话 用Fillder可以请求成功。而这个是AIR自动加上去的。
还好URLRequest可以修改Header的内容,于是我加上下面的代码
urlR.requestHeaders = [];
发现数据包里面竟然还有“Referer: app:/Test.swf”。那就只能修改Referer的值了,那么Referer的值怎么取的呢?
 
其实 这个swf文件的原始地址是在这里http://tech.163.com/06/0508/11/2GJKFC8F00091THP.html
他是这个网页里的一个flash文件,而当我请求这个页面时,数据包里就会携带Referer的信息为:
Referer: http://tech.163.com/06/0508/11/2GJKFC8F00091THP.html
因此,只要将代码改为:
urlR.requestHeaders = [new URLRequestHeader("Referer"http://tech.163.com/06/0508/11/2GJKFC8F00091THP.html)];
就可以访问了。
 
完整的代码如下:

var urlL:URLLoader = new URLLoader();

var urlR:URLRequest = new URLRequest("http://cimg3.163.com/tech/school/sunxin/vc++/12.swf");

urlR.requestHeaders = [new URLRequestHeader("Referer""http://tech.163.com/06/0508/11/2GJKFC8F00091THP.html")];

urlL.load(urlR);

 

这其实就是欺骗服务器,告诉它我调用http://cimg3.163.com/tech/school/sunxin/vc++/12.swf的引用页是http://tech.163.com/06/0508/11/2GJKFC8F00091THP.html。