本来想着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; [email protected]|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; [email protected]|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的值怎么取的呢?
他是这个网页里的
一个flash文件,而当我请求这个页面时,数据包里就会携带Referer的信息为:
因此,只要将代码改为:
就可以访问了。
完整的代码如下:
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);