2009-10-28 15 views
6

Mümkün olduğunca spesifik ve ayrıntılı olacağım ve kullanıyorum kodun bazılarını dahil edeceğim. Zaten bir arama yaptım ve benzer görünen this question'u buldum; Ancak yazar 3 yerine ActionScript 2 kullanıyordu ve kendi durumuma verdiğim cevaplardan herhangi birini etkili bir şekilde uygulayamadım.Bu çapraz etki alanı ActionScript 3 hatasını nasıl düzeltirim?

Aynı etki alanı sınırlamalarının üstesinden gelmek için JavaScript'in XMLHttpRequest nesnesinin Flash/ActionScript 3 aracılığıyla davranışını (sınırlı bir şekilde) taklit etmeye çalışıyorum. Ancak, ActionScript'in bu konuda kendi sınırlamalarına sahip olduğunu keşfediyorum. Yanılmış olabileceğimi itiraf ediyorum ama anladığım kadarıyla, tüm izinleri doğru aldığınız sürece, bu tür bir etki alanları arası komut dosyasını ActionScript kullanarak yapmak hala teorik olarak mümkündür. Ve bu yüzden başım belaya giriyor.

İlk olarak, AjaxRequest adlı bir sınıf için /ajax/AjaxRequest.as olarak kaydettiğim bazı açık kaynaklı kodları ödünç aldım. Daha sonra, /jsajax.swf numaralı son SWF dosyasına dışa aktarılan /jsajax.fla adlı bir Flash dosyası oluşturdum.

import ajax.AjaxRequest; 
Security.allowDomain("domainone.com"); 
Security.allowDomain("domaintwo.com"); 

function jsAjax(stringURL:String, stringMethod:String, stringData:String):void 
{ 
    var xhr:AjaxRequest = new AjaxRequest(stringURL); 
    xhr.contentType = "application/x-www-form-urlencoded"; 
    xhr.dataFormat = URLLoaderDataFormat.TEXT; 

    if (stringMethod.toUpperCase() == "POST") { 
     xhr.method = URLRequestMethod.POST; 
    } else { 
     xhr.method = URLRequestMethod.GET; 
    } 

    xhr.addEventListener("complete", jsAjaxResponse); 
    xhr.send(stringData); 
    return; 
} 

function jsAjaxResponse(evt:Event):void 
{ 
    ExternalInterface.call("jsAjaxResponse", evt.currentTarget.data.toString()); 
    return; 
} 

ExternalInterface.addCallback("jsAjax", jsAjax); 
ExternalInterface.call("jsAjaxReady"); 

Şimdiye kadar iyi: Şimdi, işte Flash dosyasının ilk ve tek çerçeve içermektedir ActionScript kodu var. Bu Security.allowDomain çağrılarının birine veya daha fazlasına ihtiyaç duyulmadığını hissediyorum, ancak bu sorunu çözmeye çalışmak için benim başarısız (başarısız) denemelerim vardı.

Benim JavaScript'imde tanımlı üç işlev var: jsAjax, jsAjaxResponse ve jsAjaxReady. Sonuncusu, Flash nesnesinin başarıyla yüklendiğini belirtmek için kullanılan çok temel bir işlevdir (ki bu sadece yükleme sırasında hemen bir kez ve hemen çağrılır), diğer ikisi ise veri göndermek ve almak için kullanılır. Gördüğünüz gibi, karşılık gelen ActionScript muadilleri var.

Son olarak, bu SWF dosyasını (swfobject kullanarak), yerleştirmeler ve jsAjax işlevini çağırmak için basit form denetimleri bir çift vardır /test.html denilen basit bir HTML sayfası oluşturduk. Tüm JavaScript tanımlarım da bu HTML dosyasına gömülü. Ayrıca, $_REQUEST dizisinin içeriğini basan /test.php adlı çok basit bir PHP betiği oluşturdum. Bu ajax yöntemini kullanarak talep etmeyi planladığım komut dosyası.

ben test üç senaryo vardır, ama çalışma ikisini almak için tek başardı: Ben bu dosyaların tümü yüklerseniz bir sunucuya
tüm:


SENARYO BİRİNCİ domainone.com ve test.php isteği, iyi çalışıyor. Benim dosya/klasör yapısı daha sonra şuna benzer: Bu çalışır

domainone.com/jsajax.swf 
domainone.com/test.html 
domainone.com/test.php 
Yine

, . JsAjaxResponse işlevi, verileri yalnızca test.php'den geri alır.


SENARYO İKİ: Her iki sunucularda, sol eğilerek ilk sunucuya HTML ve SWF yüklenen ve daha sonra sadece o değil mi, ikinci sunucuda PHP komut dosyası aramasını
hemen çalış. Bazı kazma yaptım ve domaintwo.com üzerinde domainone.com adresine erişim sağlayan bir crossdomain.xml dosyası oluşturarak bunu düzeltdi.Yani benim dosya/klasör yapısı şuna benziyordu:

domainone.com/jsajax.swf 
domainone.com/test.html 
domaintwo.com/test.php 
domaintwo.com/crossdomain.xml 

açıkça bu çalışır Crossdomain.xml dosyasında domainone.com izin yaparken. Yine, jsAjaxResponse işlevi, verileri yalnızca test.php'den geri alır.


SENARYO ÜÇ: Ben domaintwo.com HTML ama Yüklenen tüm zaman hem sunucularda, eğilerek sağ
, artık işe alabilir. Başka bir deyişle, domainone.com HTML domaintwo.com barındırılan bir SWF dosya başvuran olur ve bu SWF dosyası domaintwo.com bir istek yapmaya çalışıyor. Her halükarda, senaryo 2'den aynı crossdomain.xml dosyasını bıraktım. Benim dosya/klasör yapısı şuna benziyordu:

domainone.com/test.html 
domaintwo.com/jsajax.swf 
domaintwo.com/test.php 
domaintwo.com/crossdomain.xml 

Bu benim çalışma alamadım tek durum olduğunu ve bu Çalışmaya almak gerekir böyledir. İlk ikisi, sadece senaryonun çalışıp çalışmadığını görmek için test senaryolarıydı. Benim burada jsAjax işlevini çalıştırmayı denediğimde, Firebug iki kez görünür bir hata ile rüzgar:

uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.]. 
uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.]. 

Yardım! Senaryo 3'te nasıl çalıştırabilirim?

cevap

4

Sadece bunu anladım! Flash dosyamda Security.allowDomain komutları ile ilgisi vardı. Aslında domainone.com bir alt alanında test.html barındırma, ve bu onu atıyordu. Tam bir eşleşme, alt alan ve hepsi olmalı. Ben domaintwo.com başvurulan Security.allowDomain komutuna ihtiyaç duymadığı ortaya çıktı ve Senaryo 3 için hiç bulunmayacak crossdomain.xml dosyasına ihtiyacım vardı!

: Ben kullanarak sonuna bu script "gerçek" versiyonunda yana

, ben ille aslında, ben bu Flash dosyasının en üstünde kod değişti domainone.com bilmiyor olacak

import ajax.AjaxRequest; 
try { 
    var domain1:String = LoaderInfo(this.root.loaderInfo).parameters["allow"]; 
    if (domain1.length > 0) { 
     Security.allowDomain(domain1); 
    } 
} catch (error:Error) { } 
try { 
    var domain2:String = LoaderInfo(this.root.loaderInfo).parameters["allowhttps"]; 
    if (domain2.length > 0) { 
     Security.allowInsecureDomain(domain2); 
    } 
} catch (error:Error) { } 
... 

Daha sonra, JavaScript'te ilk önce SWF'yi gömmek için kullanıyorum, temel olarak sayfanın geçerli etki alanını document.location.toString()'dan alıyorum, http veya https kullanıp kullanmadığını kontrol edin ve sonra etki alanını FlashVars parametresinde allow ve/veya allowhttps. Bunu, Flash Vars'ta (Flash içinden bir çeşit otomatik algılama) açıkça belirlemeye gerek olmayan, bunu yapmak için "daha iyi" bir yol olabilir, ancak ActionScript'te bunu anlamaya yetecek kadar iyi değilim dışarı. Bu dosya zaten JavaScript ile ActionScript arasındaki çift yönlü iletişimin bir sürü yapıyor yana, bu bir anlaşma büyük değil. Bu çözüm benim için yeterince iyi.