Aug 14

js跨域的最终武器flash 不指定

bearjia , 06:12 , JS无尽循环 , 评论(0) , 引用(0) , 阅读(773) , Via 本站原创 | |
当门户网站频道过多的时候,并且绑定的是不同的二级子域。
这个时候就会发现,JS在整站中跨域的问题很让人恼火。
到处都是无权限。
我们会想到用iframe的方式来调用页面来实现跨域,但是那很麻烦很麻烦,而且还不好控制。
JQ中不是有跨域的解决方案吗?
NO!那个也麻烦。
flash本身就有跨域的方案,本身加入System.security.allowDomain("*");
然后写一个跨域规则的crossdomain.xml即可。

flash跨域类这么写:

package {
  
  import flash.display.*;
  import flash.events.*;
  import flash.net.*;
  import flash.external.ExternalInterface;
  import flash.system.Security;  

  public class FlashProxy extends Sprite{  
    
    private var _params:Object;
    private var _loader:URLLoader;
    private var _method:String;
    private var _id:String;
    private var _parse:Boolean;
    private var _inited:Boolean;
    private var _data:String;
    private var _xml:XML;
    
    public function FlashProxy(){
      Security.allowDomain('*');
      _inited = false;
      _data = "";
      _parse = true;
      _method = URLRequestMethod.POST;
      _loader = new URLLoader();
      configureListeners(_loader);
    }
    
    public function load(page:String,params:Object=null):void{
      if(!_inited){
        showError("FlashProxy还没有初始化!");
      }
      if(page == null || page == undefined){
        showError("page参数为必须的!");
        return;
      }
      var vars:URLVariables = new URLVariables();
      vars.tmp = Math.random();
      if(params != null){        
        for(var key in params){
          if(key == "tmp"){
            continue;
          }
          vars[key] = params[key];
        }
      }      
      _loader.dataFormat = URLLoaderDataFormat.TEXT;
      var request:URLRequest = new URLRequest(page);
      request.method = _method;
      request.data = vars;
      _loader.load(request);
    }
    
    public function setParse(value:Boolean):void{
      _parse = value;
    }
    
    public function setMethod(value:String):void{
      if(value == null || value == undefined){
        return;
      }
      value = StringUtil.trim(value);
      if(value.toLocaleUpperCase() == URLRequestMethod.POST || value.toLocaleUpperCase() == URLRequestMethod.GET){
        _method = value.toLocaleUpperCase();
      }      
    }
    
    public function getData():String{
      return _data;
    }
    
    private function configureListeners(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.COMPLETE, completeHandler);
            dispatcher.addEventListener(Event.OPEN, openHandler);
            dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
            dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        }
    
    private function completeHandler(event:Event):void {
      _data = _loader.data;
      if(_parse){
        try{
          _xml = new XML(_data);          
        }catch(error:Error){
          _parse = false;
          _xml = null;
          Tracer.debug("xml解析错误!");
        }
      }
            ExternalInterface.call(_id+".onComplete");
        }

        private function openHandler(event:Event):void {
            ExternalInterface.call(_id+".onOpen");
        }

        private function progressHandler(event:ProgressEvent):void {       
      ExternalInterface.call(_id+".onProgress",event.bytesLoaded,event.bytesTotal);
        }

        private function securityErrorHandler(event:SecurityErrorEvent):void {
            showError("读取失败!\n  不能跨域访问,可能是你在web服务端根目录下没有放置crossdomain.xml文件!");
        }

        private function httpStatusHandler(event:HTTPStatusEvent):void {
            showError("读取失败!\n  HTTP错误代码为:"+event.status);
        }

        private function ioErrorHandler(event:IOErrorEvent):void {
            showError("读取失败!\n  可能是因为下列原因:\n    1.网络忙,请稍候重试!\n    2.访问的web服务端没有开启!");
        }
    
    public function alert(msg:String):void{
      navigateToURL(new URLRequest(msg));
    }
    
    public function showError(msg:String):void{      
      ExternalInterface.call(_id+".onError",msg);
    }
  }
  
}


当然,这个是较简单的一个跨域类。
APMServ的作者在其博客上也发了一个JS通过FLASH来跨域的方案,很全面。
参考地址是:
引用
http://blog.s135.com/ajaxcdr/
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]