سؤال

انا ذاهب الى أن تكون محددة كما مطول ممكن وتشمل بعض من مدونة أنا باستخدام.لقد عملت بالفعل البحث وجدت هذا السؤال, الذي يبدو مماثلة ؛ غير أن صاحب البلاغ كان هناك استخدام أكشن 2 بدلا من 3 ، وأنا لا يمكن أن يبدو أن تطبيق أي من الإجابات نظرا إلى الوضع على نحو فعال.

أنا أحاول محاكاة (بشكل محدود) سلوك جافا سكريبت هو كائن مدعوم من خلال فلاش/ActionScript 3 ، من أجل التغلب على نفس المجال القيد.ولكني أكتشف أنه أكشن والقيود الخاصة بها في هذا الصدد.أنا أعترف أنني قد أكون مخطئا ولكن من ما أفهم فمن الناحية النظرية لا يزال من الممكن أن تفعل هذا النوع من البرمجة النصية عبر النطاقات باستخدام أكشن, طالما يمكنك الحصول على كافة الأذونات الصحيحة.و أنا الوقوع في مشاكل.

أولا أنا اقترضت بعض التعليمات البرمجية المصدر المفتوح لفئة تسمى 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");

حتى الآن جيد جدا.لدي شعور بأن واحدا أو أكثر من تلك Security.allowDomain مكالمات غير ضرورية ، ولكنها كانت (فاشلة) محاولات لمحاولة حل هذه المشكلة.

في جافا سكريبت, لدي ثلاث وظائف محددة: jsAjax, jsAjaxResponse, ، jsAjaxReady.آخر واحد هو مجرد جدا الوظيفة الأساسية المستخدمة للإشارة إلى أن فلاش وجوه تحميلها بنجاح (الذي يسمى فقط مرة واحدة و فور تحميله) ، في حين أن اثنين آخرين تستخدم لإرسال واستقبال البيانات.كما يمكنك أن ترى, لديهم المقابلة أكشن نظرائهم.

أخيرا, أنا خلقت صفحة HTML بسيطة تسمى /test.html أن يضمن هذا الملف SWF (باستخدام swfobject) و لديه زوجين من شكل بسيط ضوابط استدعاء jsAjax وظيفة.كل من بلدي جافا سكريبت التعاريف هي جزء لا يتجزأ في هذا الملف HTML جدا.أنا خلقت أيضا بسيط جدا النصي PHP يسمى /test.php أن يطبع محتويات $_REQUEST الصفيف.هذا السيناريو لا تنوي طلب استخدام هذه طريقة اياكس.

هناك ثلاثة سيناريوهات التي اختبرت ولكن كنت فقط قادرة على الحصول على اثنين منهم العمل:


سيناريو واحد:كل على خادم واحد ،
إذا كنت تحميل كل هذه الملفات domainone.com ثم طلب test.php, أنه يعمل بشكل جيد.ملفي/بنية المجلد ثم يبدو مثل هذا:

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

مرة أخرى ، يعمل هذا.على jsAjaxResponse وظيفة تتلقى البيانات من test.php على ما يرام.


السيناريو الثاني:على كلا ملقمات يميل اليسار
عندما قمت بتحميل HTML و SWF إلى الخادم الأول, و من ثم يكون ذلك استدعاء البرنامج النصي PHP على ملقم الثاني ، لم يعمل على الفور.قمت ببعض البحث ووجدت أن من خلق crossdomain.xml الملف على domaintwo.com أن منح الوصول إلى domainone.com هذه ثابتة.لذا ملف/مجلد هيكل يشبه هذا:

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

عندما صراحة السماح domainone.com في crossdomain.xml الملف ، يعمل هذا.مرة أخرى ، jsAjaxResponse وظيفة تتلقى البيانات من test.php على ما يرام.


السيناريو الثالث:على كلا ملقمات يميل
عندما قمت بتحميل جميع ولكن HTML domaintwo.com أنا لم يعد يمكن الحصول على عمل.وبعبارة أخرى, HTML على domainone.com هو الرجوع إلى ملف SWF استضافتها على domaintwo.com و هذا ملف SWF هو محاولة تقديم طلب إلى domaintwo.com.تركت نفسها crossdomain.xml الملف من السيناريو 2 ، فقط في حالة.الملف/المجلد هيكل يشبه هذا:

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

هذه هي الحالة الوحيدة التي لم أتمكن من الحصول على العمل, وهذا هو حال أردت الحصول على العمل.أول اثنين كان حقا مجرد سيناريوهات اختبار لمعرفة ما إذا كان البرنامج النصي تعمل على الإطلاق.عند محاولة تشغيل jsAjax وظيفة هنا كنت تصل الرياح مع الخطأ الذي يظهر مرتين في الحرائق:

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?

هل كانت مفيدة؟

المحلول

أنا فقط اكتشفت ذلك!أنها لم تضطر إلى القيام به مع Security.allowDomain الأوامر في ملف فلاش.كنت في الواقع استضافة test.html على دومين فرعي من domainone.com و التي تم رميها بعيدا.يجب أن يكون مطابق, فرعي و كل شيء.اتضح لم أكن في حاجة إلى Security.allowDomain الأمر الذي الرجوع إليها domaintwo.com ولا أريد crossdomain.xml الملف أن يكون حاضرا في كل سيناريو 3!

لأن في "ريال مدريد" نسخة من هذا السيناريو الذي لا ينتهي باستخدام لن تعرف بالضرورة ما domainone.com في الواقع ، لقد غيرت رمز في الجزء العلوي من ملف فلاش إلى هذا:

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 في flashvars المعلمة.هناك قد يكون "أفضل" طريقة للقيام بذلك أن لا تعتمد على تحديد المجال تصل صراحة في فلاش فأر (نوع من الكشف التلقائي من داخل فلاش), ولكن أنا لست ضليع في أكشن جيدا بما فيه الكفاية لمعرفة ذلك.و منذ هذا الملف هو القيام بالفعل مجموعة كاملة من الاتصال ثنائي الاتجاه بين جافا سكريبت أكشن, انها ليست صفقة كبيرة.هذا الحل هو جيد بما فيه الكفاية بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top