문제

나는 가능한 한 구체적이고 장점이 될 것이며 내가 사용하는 코드 중 일부를 포함시킬 것입니다. 나는 이미 검색을했고 발견했다 이 질문, 그것은 비슷해 보인다; 그러나 저자는 3 대신 Actionscript 2를 사용했으며 내 상황에 대한 답을 효과적으로 적용 할 수 없었습니다.

동일한 도메인 제한을 극복하기 위해 Flash/Actionscript 3을 통해 JavaScript의 XMLHTTPrequest 객체의 동작을 (제한된 방식으로) 에뮬레이션하려고합니다. 그러나 나는 Actionscript가 그와 관련하여 고유 한 한계가 있음을 발견하고 있습니다. 나는 내가 실수했을지도 모른다는 것을 인정하지만, 내가 이해 한 바에 따르면 모든 권한을 제대로 얻는 한 ActionScript를 사용하여 이런 종류의 크로스 도메인 스크립팅을 수행하는 것이 이론적으로 여전히 가능하다. 그리고 그것이 내가 곤경에 빠지는 곳입니다.

먼저, 나는 AjaxRequest, 내가 그대로 저장했습니다 /ajax/AjaxRequest.as. 그런 다음 호출 된 플래시 파일을 만들었습니다 /jsajax.fla 최종 SWF 파일로 내보내는 것은 /jsajax.swf. 이제 플래시 파일의 첫 번째 및 유일한 프레임으로 구성된 ActionScript 코드는 다음과 같습니다.

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 전화는 필요하지 않지만이 문제를 해결하려는 나의 (실패한) 시도였습니다.

내 JavaScript에는 세 가지 기능이 정의되었습니다. jsAjax, jsAjaxResponse, 그리고 jsAjaxReady. 마지막은 플래시 객체가 성공적으로로드 된 (한 번만 호출되면 즉시 호출)를 나타내는 데 사용되는 매우 기본적인 기능이며, 다른 두 개는 데이터를 보내고 수신하는 데 사용됩니다. 보시다시피, 해당 액션 스크립트 대응자가 있습니다.

마지막으로 간단한 HTML 페이지를 만들었습니다 /test.html 이 SWF 파일을 포함합니다 (사용 swfobject) 그리고 전화를위한 몇 가지 간단한 양식 컨트롤이 있습니다. jsAjax 기능. 내 JavaScript 정의는 모두이 HTML 파일에 포함되어 있습니다. 또한 매우 간단한 PHP 스크립트를 만들었습니다 /test.php 그 내용을 인쇄합니다 $_REQUEST 정렬. 이것이 제가이 Ajax 메소드를 사용하여 요청하려는 스크립트입니다.

테스트 한 세 가지 시나리오가 있지만 두 가지 시나리오 만 작동 할 수있었습니다.


시나리오 1 : 모두 하나의 서버에 있습니다
이 모든 파일을 domainone.com에 업로드 한 다음 test.php를 요청하면 잘 작동합니다. 내 파일/폴더 구조는 다음과 같습니다.

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

다시, 이것은 작동합니다. jsajaxResponse 함수는 test.php에서 데이터를 다시받습니다.


시나리오 둘째 : 두 서버에서 왼쪽으로 기울어 져 있습니다
HTML과 SWF를 첫 번째 서버에 업로드 한 다음 두 번째 서버에서 PHP 스크립트를 호출하면 즉시 작동하지 않았습니다. 나는 약간 파고 들었고 crossdomain.xml domainone.com에 액세스 할 수있는 domaintwo.com의 파일은이를 수정했습니다. 내 파일/폴더 구조는 다음과 같습니다.

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

Crossdomain.xml 파일에서 Domainone.com을 명시 적으로 허용하면 이것은 작동합니다. 다시, JSAJaxResponse 함수는 test.php에서 데이터를 다시받습니다.


시나리오 세 가지 : 두 서버 모두에서 올바르게 기대합니다
html을 제외한 모든 것을 domaintwo.com에 업로드했을 때 더 이상 작동 할 수 없었습니다. 다시 말해서, domainone.com의 HTML은 domaintwo.com에서 호스팅 된 SWF 파일을 참조하고 있으며, 해당 SWF 파일은 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에서 어떻게 작동하게합니까?

도움이 되었습니까?

해결책

방금 알아 냈습니다! 그것은 그것과 관련이있었습니다 Security.allowDomain 내 플래시 파일의 명령. 나는 실제로 주최했다 test.html Domainone.com의 하위 도메인에서, 그것은 그것을 버리고있었습니다. 정확히 일치, 하위 도메인 및 모두 여야합니다. 내가 필요하지 않은 것으로 밝혀졌다 Security.allowDomain domaintwo.com을 참조하는 명령도 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) { }
...

그런 다음, JavaScript에서 처음에 SWF를 포함시키는 데 사용하고 있습니다. 기본적으로 페이지의 현재 도메인을 가져옵니다. document.location.toString(), HTTP 또는 HTTPS를 사용하고 있는지 확인한 다음 도메인을 다음에 전달하십시오. allow 및/또는 allowhttps FlashVars 매개 변수에서. Flash VARS에서 도메인을 명시 적으로 설정하는 데 의존하지 않는 "더 나은"방법이있을 수 있지만 (플래시 내에서 일부 자동 감지) ActionScript에 정통하지는 않습니다. 밖으로. 그리고이 파일은 이미 JavaScript와 ActionScript 사이의 양방향 통신을 이미 수행하고 있기 때문에 그렇게 큰 거래는 아닙니다. 이 솔루션은 나에게 충분합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top