2009-10-28 12 views
6

मैं जितना संभव हो उतना विशिष्ट और वर्बोज़ बनने जा रहा हूं और इसमें से कुछ कोड शामिल कर रहा हूं। मैंने पहले से ही एक खोज की है और this question मिला है, जो समान लगता है; हालांकि लेखक 3 के बजाय एक्शनस्क्रिप्ट 2 का उपयोग कर रहे थे, और मैं अपनी स्थिति को प्रभावी ढंग से दिए गए किसी भी उत्तर को लागू नहीं कर सका।मैं इस क्रॉस-डोमेन एक्शनस्क्रिप्ट 3 त्रुटि को कैसे ठीक करूं?

मैं उसी डोमेन सीमा को पार करने के लिए फ्लैश/एक्शनस्क्रिप्ट 3 के माध्यम से जावास्क्रिप्ट के XMLHttpRequest ऑब्जेक्ट के व्यवहार को अनुकरण (सीमित तरीके से) करने का प्रयास कर रहा हूं। लेकिन मुझे पता चल रहा है कि उस संबंध में एक्शनस्क्रिप्ट की अपनी सीमाएं हैं। मैं मानता हूं कि मैं गलत हो सकता हूं, लेकिन जो मैं समझता हूं उससे सैद्धांतिक रूप से अभी भी एक्शनस्क्रिप्ट का उपयोग कर इस तरह के क्रॉस-डोमेन स्क्रिप्टिंग करना संभव है, जब तक आपको सभी अनुमतियां सही मिलती हैं। और यही वह जगह है जहां मैं परेशानी में भाग रहा हूं।

सबसे पहले, मैंने AjaxRequest नामक कक्षा के लिए कुछ ओपन-सोर्स कोड उधार लिया, जिसे मैंने /ajax/AjaxRequest.as के रूप में सहेजा है। इसके बाद मैंने /jsajax.fla नामक एक फ्लैश फ़ाइल बनाई जो अंतिम एसडब्ल्यूएफ फ़ाइल, /jsajax.swf पर निर्यात करता है।

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"); 

अब तक तो अच्छा: अब, यहाँ ActionScript कोड है कि फ्लैश फाइल का पहला और एकमात्र फ्रेम शामिल है। मुझे एहसास है कि Security.allowDomain कॉलों में से एक या अधिक की आवश्यकता नहीं है, लेकिन वे इस समस्या को हल करने का प्रयास करने के लिए मेरे (असफल) प्रयास थे।

मेरी जावास्क्रिप्ट में, मुझे तीन कार्य परिभाषित किए गए हैं: jsAjax, jsAjaxResponse, और jsAjaxReady। आखिरी वाला यह एक बहुत ही बुनियादी कार्य है जो इंगित करता है कि फ्लैश ऑब्जेक्ट सफलतापूर्वक लोड किया गया है (जिसे केवल एक बार और इसे लोड करने पर तुरंत कहा जाता है), जबकि अन्य दो डेटा भेजने और प्राप्त करने के लिए उपयोग किए जाते हैं। जैसा कि आप देख सकते हैं, उनके पास इसी एक्शनस्क्रिप्ट समकक्ष हैं।

अंत में, मैं /test.html नामक एक साधारण HTML पेज है कि इस SWF फ़ाइल (swfobject उपयोग करते हुए) को एम्बेड करता है और jsAjax समारोह फोन करने के लिए साधारण से फ़ॉर्म नियंत्रण की एक जोड़ी है बनाया। मेरी सभी जावास्क्रिप्ट परिभाषाएं इस HTML फ़ाइल में भी एम्बेड की गई हैं। मैंने /test.php नामक एक बहुत ही सरल PHP स्क्रिप्ट भी बनाई है जो $_REQUEST सरणी की सामग्री को प्रिंट करता है। यही वह स्क्रिप्ट है जिसे मैं इस AJAX विधि का उपयोग करने का अनुरोध करना चाहता हूं।

तीन परिदृश्य है कि मैं परीक्षण किया है, लेकिन मैं केवल काम कर उनमें से दो प्राप्त करने में सक्षम था: मैं करने के लिए इन फ़ाइलों के सभी अपलोड करते हैं एक सर्वर
पर सभी:


SCENARIO एक domainone.com, और फिर test.php का अनुरोध करें, यह ठीक काम करता है। मेरे फ़ाइल/फ़ोल्डर संरचना तो इस तरह दिखता है:

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

फिर, इस काम करता है। JsAjaxResponse फ़ंक्शन test.php से डेटा को ठीक से वापस प्राप्त करता है।


परिदृश्य दो: दोनों सर्वर पर, झुकाव छोड़ दिया
मैं पहली बार सर्वर पर एचटीएमएल और SWF अपलोड किया है, और फिर बस यह दूसरी सर्वर पर PHP स्क्रिप्ट फोन है, ऐसा नहीं है जब तुरंत काम करो। मैंने कुछ खुदाई की, और पाया कि domaintwo.com पर crossdomain.xml फ़ाइल बनाकर जिसने domainone.com तक पहुंच प्रदान की, यह तय किया गया।जब स्पष्ट रूप से crossdomain.xml फ़ाइल में domainone.com अनुमति देता है, यह काम करता है

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

: तो मेरी फ़ाइल/फ़ोल्डर संरचना इस तरह देखा। फिर, jsAjaxResponse फ़ंक्शन test.php से डेटा को ठीक से वापस प्राप्त करता है।


SCENARIO तीन: दोनों सर्वर पर, झुकाव सही
जब मैं domaintwo.com करने के लिए सभी लेकिन एचटीएमएल अपलोड किया है, मैं अब यह काम करने के लिए मिल सकता है। दूसरे शब्दों में, domainone.com पर HTML domaintwo.com पर होस्ट की गई एक एसडब्ल्यूएफ फ़ाइल का संदर्भ दे रहा है, और यह कि एसडब्ल्यूएफ फ़ाइल domaintwo.com से अनुरोध करने का प्रयास कर रही है। मैंने परिदृश्य 2 से वही crossdomain.xml फ़ाइल छोड़ी, बस मामले में। मेरे फ़ाइल/फ़ोल्डर संरचना इस तरह देखा:

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

यह केवल मामले मैं काम नहीं कर रहा हो सकता है है, और इस मामले में मैं काम कर पाने की जरूरत है। पहला दो वास्तव में परीक्षण परिदृश्य थे ताकि यह देखने के लिए कि स्क्रिप्ट बिल्कुल काम कर रही थी या नहीं। जब मैं यहां अपने jsAjax समारोह चलाने का प्रयास, मैं एक त्रुटि है कि पता चलता है के साथ दो बार Firebug में हवा:

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.]. 

मदद! मैं इसे परिदृश्य 3 में कैसे काम कर सकता हूं?

उत्तर

4

मैं सिर्फ यह सोचा बाहर! इसे मेरी फ्लैश फ़ाइल में Security.allowDomain कमांड के साथ करना होगा। मैं वास्तव में domainone.com के उप डोमेन पर test.html होस्ट कर रहा था, और वह इसे फेंक रहा था। यह एक सटीक मैच, सबडोमेन और सब होना चाहिए। यह पता चला है कि मुझे domaintwo.com का संदर्भ देने वाले Security.allowDomain कमांड की आवश्यकता नहीं थी, और न ही मुझे crossdomain.xml फ़ाइल को परिदृश्य 3 के लिए उपस्थित होने की आवश्यकता थी!

इस स्क्रिप्ट है कि मैं का उपयोग कर अंत के 'असली' संस्करण में के बाद से

, मैं जरूरी पता नहीं होगा क्या domainone.com वास्तव में है, मैं कोड इस के लिए Flash फ़ाइल के शीर्ष पर बदल दिया है:

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) { } 
... 

फिर, जावास्क्रिप्ट में मैं SWF एम्बेड करने के लिए वहाँ पहली जगह में उपयोग कर रहा हूँ, मैं मूल रूप से पृष्ठ के वर्तमान डोमेन document.location.toString() से हड़पने की जांच यह http या https उपयोग कर रहा है कि क्या करें, और तब के रूप में में डोमेन पारित फ्लैशवर्स पैरामीटर में allow और/या allowhttps। ऐसा करने के लिए एक "बेहतर" तरीका हो सकता है जो फ्लैश वर्र्स (फ्लैश के भीतर से किसी प्रकार का स्वचालित पता लगाने) में डोमेन को स्पष्ट रूप से सेट करने पर निर्भर नहीं है, लेकिन मुझे एक्शनस्क्रिप्ट में अच्छी तरह से पता नहीं है कि यह समझने के लिए पर्याप्त है बाहर। और चूंकि यह फ़ाइल जावास्क्रिप्ट और एक्शनस्क्रिप्ट के बीच पहले ही बिडरेक्शनल संचार का पूरा समूह कर रही है, इसलिए यह एक सौदा का बड़ा नहीं है। यह समाधान मेरे लिए काफी अच्छा है।