• AIR 访问网络资源老提示 Unhandled ioError 错误的解决办法


    本来想着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的信息为:
    因此,只要将代码改为:
    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
  • 相关阅读:
    C#网络编程之Http请求
    使用 pdf.js 在网页中加载 pdf 文件
    程序员转型技术管理,这几本书不能错过
    HTTPS小结 、TSL、SSL
    clipboard 在 vue 项目中,on 事件监听回调多次执行
    Vue 引入 .md 文件,解析markdown语法
    Vue cli4.0 代理配置
    npm publish 一直报错 404
    JSON 多层对象获取键值
    Tomcat8配置Https协议,Tomcat配置Https安全访问,Tomcat Https配置
  • 原文地址:https://www.cnblogs.com/huomiao/p/2544851.html
Copyright © 2020-2023  润新知