2014-01-29 2 views
3

크로스 도메인 교차 브라우저 .js 요청 (libs없이)을 만들려고합니다.Mozilla 및 Chrome에서 XMLHttpRequest 상태 0 오류

var isIE8 = window.XDomainRequest ? true : false; 
var invocation = createCrossDomainRequest(); 
var url = 'http://someserver.com/cgi-bin/targets.cgi?sid='; 

function createCrossDomainRequest(url, handler) 
{ 
    var request; 
    if (isIE8) 
    { 
     request = new window.XDomainRequest(); 
    } 
    else 
    { 
     request = new XMLHttpRequest(); 
    } 
    return request; 
} 

function sendTarget(sid,target) 
{ 
    if (invocation) 
    {    
     var phone_id = getCookie('phone_cookie'); 
     url = url + sid +'&target='+target+'&phone_id='+phone_id+'&url='+encodeURIComponent(document.URL); 
     if(isIE8) 
     { 
      invocation.onload = outputResult; 
      invocation.open("GET", url, true); 
      invocation.send(); 
     } 
     else 
     { 
      invocation.open('GET', url, true); 
      invocation.onreadystatechange = handler; 
      invocation.send(); 
     } 
    } 
    else 
    { 
     var text = "No Invocation TookPlace At All"; 
    } 
} 

function handler(evtXHR) 
{ 
    if (invocation.readyState == 4) 
    { 
     if (invocation.status == 200) 
     { 
      outputResult(); 
     } 
     else 
     { 
      var text = "Invocation Errors Occured"; 
     } 
    } 
} 

function outputResult() 
{ 
    var response = invocation.responseText; 
} 

그것은 모질라와 크롬 IE에서 작동하지만하지. 이러한 브라우저에서 "호출 오류가 발생했습니다"라는 오류가 발생합니다. invocation.status가 0입니다. 액세스 제어 허용 - 원본을 *로 설정하십시오.

이 문제를 해결하려면 어떻게해야합니까?

모든 라이브러리를 사용할 수 없으며 JS (기술 문제) 만 해결할 수 있습니다. 아니 JQuery! 이 코드는 여러 클라이언트 웹 사이트 (하나 또는 두 개가 아님)에 있어야합니다. 응답을받을 필요가 없습니다. 요청을 보내면됩니다. 그리고 XMLHttpRequest에 반복되지 않습니다 - 어떤 아이디어?

답변

2

나는 위에서 제공 한 코드를 사용하여 좀 더 일반적인 것으로 약간 수정했습니다. 그러나이를 다시 변경할 수 있어야합니다. 다음 코드는 크롬과 파이어 폭스에서 작동 :

var isIE8 = window.XDomainRequest ? true : false; 
var url = 'http://www.phobos7.co.uk/research/xss/simple.php'; 
var resultText = ''; 
var invocation = createCrossDomainRequest(); 
makeRequest(); 

function createCrossDomainRequest(url, handler) { 
    var request; 
    if (isIE8) { 
     request = new window.XDomainRequest(); 
    } else { 
     request = new XMLHttpRequest(); 
    } 
    return request; 
} 

function makeRequest() { 
    if (invocation) { 
     if (isIE8) { 
      invocation.onload = requestSucceeded; 
      invocation.open("GET", url, true); 
      invocation.send(); 
     } else { 
      invocation.open('GET', url, true); 
      invocation.onreadystatechange = handler; 
      invocation.send(); 
     } 
    } else { 
     resultText = "No Invocation TookPlace At All"; 
    } 
} 

function handler(evtXHR) { 
    if (invocation.readyState == 4) { 
     if (invocation.status == 200) { 
      requestSucceeded(); 
     } else { 
      resultText = "Invocation Errors Occured"; 
     } 
    } 
} 

function requestSucceeded() { 
    resultText = invocation.responseText; 
    outputResult(); 
} 

function outputResult() { 
    document.getElementById('output').innerHTML = resultText; 
} 

당신은 여기를 테스트 할 수 있습니다 http://jsfiddle.net/leggetter/3QfQe/

응답 헤더를이 사이트에서 - CORS 수 있습니다 -입니다 :

Access-Control-Allow-Origin:* 
Connection:Keep-Alive 
Content-Type:text/html 
Date:Wed, 12 Feb 2014 22:48:37 GMT 
Keep-Alive:timeout=5, max=100 
Server:Apache 
Transfer-Encoding:chunked 
X-Powered-By:PHP/5.3.24 

만을 Access-Control-Allow-Origin:*이 필요합니다.

위의 JavaScript를 사용하고 Access-Control-Allow-Origin:* 헤더가 설정되어 있으면 JavaScript에서 상호 도메인 요청을 할 수 있습니다.

+0

설정 한 URL에 대한 코드가 작동합니다. 내 응용 프로그램에서 다른 크로스 도메인 URL을 시도 할 때 다시 상태 0을 제공합니다. 제안하십시오. –

+0

"코드가 작동 중"입니다 - "작동하지 않는다"고 말씀하셨습니까? 나는 테스트를했고 아직도 나를 위해 일합니다. 문제가있는 경우 자세한 정보를 제공해주십시오. – leggetter

+0

귀하의 URL로 작업 중입니다. 내가 그것을 내 URL로 대체 할 때 크롬과 파이어 폭스에서 0으로 다시 상태를 부여합니다. –

관련 문제