跨域的终极解决办法 使用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文件的下载。所以如果不想了解这个程序到底做了什么,只想直接使用的话也行。文章结尾处有这个程序和例子的下载地址。 //跨域请求接口
//作者:次碳酸钴
//有问题请提交邮箱 [email protected]
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 >  接着是我们要跨域获取的目标文件

你可能感兴趣的:(跨域的终极解决办法 使用AS跨域)