Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

跨域的终极解决办法 使用AS跨域

  AS虽然可以跨域,但是有个要求,就是必须得到对方的服务器上策略的允许。所以我们先来写个策略文件。 <?xml version="1.0"?>
<cross-domain-policy>
  <allow-access-from domain="127.0.0.1" secure="true" /> 
</cross-domain-policy>
  这个就是策略文件的内容,这个文件必须在目标服务器的根目录上,名为crossdomain.xml才行。文件的内容从字面上理解就好了,这些单词我就不逐个解释了,现在我要从127.0.0.1这个域访问localhost这个域,也就是说,目标服务器的域是localhost,请求域是127.0.0.1所以这个文件中,允许跨域的域名就写127.0.0.1,这没啥难理解的。
  接着,我们要来做最重要的工作,就是写AS,并编译成SWF。如果没学过AS也没关系,我会给程序完整的注释一遍,然后提供SWF文件的下载。所以如果不想了解这个程序到底做了什么,只想直接使用的话也行。文章结尾处有这个程序和例子的下载地址。 //跨域请求接口
//作者:次碳酸钴
//有问题请提交邮箱 one911213@163.com
package {
  import flash.display.Sprite;
  import flash.system.Security;
  import flash.external.ExternalInterface;
  import flash.net.*;
  import flash.events.Event;
  //上面一堆是命名空间的引用,下面这个是主类
  public class CrossDomain extends Sprite {
    //这个函数名和类名相同,是入口函数
    public function CrossDomain(){
      //声明几个需要用到的变量,看变量名就能知道是什么
      var method:String,url:String,callback:String;
      //定义接口setTargetDomain,设置目标域名
      ExternalInterface.addCallback(
        "setTargetDomain",function(e){
          //加载目标域名上的跨域策略文件
          Security.loadPolicyFile(e);
        }
      );
      //定义接口open,用来放置用户请求的参数
      ExternalInterface.addCallback(
        "open",function(m,u,c){
          //把用户传入的三个参数放到最初声明的变量中
          method=m,url=u,callback=c;
        }
      );
      //定义接口send,是发送请求,参数是请求的数据
      ExternalInterface.addCallback(
        "send",function(data){
          //创建请求对象,并把请求参数赋予它
          var request:URLRequest=new URLRequest(url);
          request.method=URLRequestMethod[method];
          request.data=data;
          //创建发送请求的对象
          var loader:URLLoader=new URLLoader();
          //给发送请求的对象添加个完成的事件
          loader.addEventListener(
            Event.COMPLETE,
            function(e:Event){
              //完成时调用JS方法
              ExternalInterface.call(callback,loader.data);
            }
          );
          //用发送请求的对象,把请求对象发送出去
          loader.load(request);
        }
      );
    };
  };
};
  现在我们用FLEX把它编译成SWF文件就可以使用它了。下面是使用的例子。 <!--这个文件是http://127.0.0.1/test0.html-->
<script>
//文档点击时发送一个跨域POST请求
document.onclick=function(){
  //调用setTargetDomain接口,设置目标域的域名
  CrossDomain.setTargetDomain("localhost");
  //调用open接口,输入请求的参数
  CrossDomain.open(
    "POST",
    "http://localhost/test.php",
    "CrossDomain_onResponse"
  );
  //调用send接口,发送请求数据
  CrossDomain.send("name=次碳酸钴");
  //这个open和send被我定义的有点像普通的HTTP对象,所以比较容易使用
};
//显示返回的数据
function CrossDomain_onResponse(e){
  alert(e);
};
</script>
<!--这个是载入这个接口,就和加载普通FLASH的方法一样-->
<object type="application/x-shockwave-flash"
  id="CrossDomain" width="0" height="0"
  data="CrossDomain.swf">
  <param name="movie" value="CrossDomain.swf" />
</object>
  接着是我们要跨域获取的目标文件 <?
//这个是http://localhost/test.php
echo $_POST['name'].' ← 这货是SB。';
?>
  然后我们打开浏览器访问http://127.0.0.1/test0.html,并点击文档以发送请求。

  返回的数据就通过回调函数输出了。

  最后是上面几个文件的下载地址: AS跨域接口.rar
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^