2011-12-15 19 views
10

クロスサイトXMLHttpRequestをJavaScriptから実行できますか?ドメイン間でXMLHttpRequestを使用することは可能ですか

私は限界を理解し、なぜ一般的に働くことができませんが、Firefoxの3.5の、これが動作するようになっている

Access-Control-Allow-Origin: *

があります。

これは、ページを提供していないドメインから要求が送信された場合、サーバーが気にしないことをブラウザに通知します。

私が使用しているコードは以下のとおりです。

function sendData(webservicePayload, callbackFunction) { 
var request = null; 
if (!window.XMLHttpRequest) { // code for IE 
    try { 
     request = new ActiveXObject('Msxml2.XMLHTTP'); 
    } catch (e) { 
     try { 
      request = new ActiveXObject('Microsoft.XMLHTTP'); 
     } catch (E) { 
      return 'Create XMLHTTP request IE'; 
     } 
    } 
} else { // code for Mozilla, etc. 
    request = new XMLHttpRequest(); 
} 
/* 
* Setup the callback function 
*/ 
request.onreadystatechange = function() { 
    if (request.readyState == 4 && request.status < 300) { 
     eval(callbackFunction); 
    } 
}; 
if (!request) { 
    nlapiLogExecution('ERROR', 'Create XMLHTTP request', 'Failed'); 
    return; 
} 
/* 
* Setup the request headers 
*/ 

request.open('POST','http://www.another.domain.co.uk/webservice.asmx', true); 
request.setRequestHeader('Man','POST http://www.another.domain.co.uk/webservice.asmx HTTP/1.1'); 
request.setRequestHeader('MessageType', 'CALL'); 
request.setRequestHeader('Content-Type', 'text/xml; charset="utf-8"'); 
request.setRequestHeader('Cache-Control', 'no-cache'); 
request.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 

request.setRequestHeader('SOAPAction','http://www.another.domain.co.uk/WebService/eService'); 
request.send(webservicePayload); 

}

これは期待される応答ヘッダ

RESPONSE

を正しい要求ヘッダー

REQUEST

OPTIONS /webservice.asmx HTTP/1.1 
Host: www.another.domain.co.uk 
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-gb,en;q=0.5 
Accept-Encoding: gzip, deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Connection: keep-alive 
Origin: https://my.domain.com 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: cache-control,content-type,man,messagetype,soapaction 
Pragma: no-cache 
Cache-Control: no-cache 

を送信および受信しています

HTTP/1.1 403 Forbidden 
Server: Microsoft-IIS/5.1 
Date: Wed, 14 Dec 2011 13:43:27 GMT 
X-Powered-By: ASP.NET 
Access-Control-Allow-Origin: * 
Connection: close 
Content-Type: text/html 
Content-Length: 44 

ご覧のとおり、Orginはリクエストに指定されており、サーバーは任意の( "*")ドメインの受け入れを受け付けて応答します。

なぜ私は「Forbidden 403」を得ているのですが、私がやったことはすべて正しいと思うのですが、どうしてうまくいかないのでしょうか?

誰かがこれを取得していますか?

あなたは原因を知っていますか?

+2

ブラウザ、すべてのブラウザがCORS – Raynos

+0

をサポートし、IEのためにあなたがする必要がありません:

Access-Control-Allow-Origin: * 

はあなたがここにプリフライトリクエストおよび取扱CORS要求についての詳細を学ぶことができます。実際のリクエストに応じて、あなただけの次のヘッダーを必要としますXMLHTTPRequestではなくXDomainRequestを使用します。しかし、はい、クロスドメインXHRは非常にうまく動作し、私は例えば私のサイトからimgurにデータを送信するためにそれを使用します。ライブラリを使って、厄介な細部を抽象化することをお勧めします。 –

+0

JS /ブラウザの問題よりもサーバーの問題に似ています。 OPTIONS要求を正しく処理するAPSコードを確認してください。 – Gerben

答えて

3

CORsリクエストは実際には、1)プリフライトリクエストと2)実際のリクエストの2つの物理HTTPリクエストで構成されます。上記で投稿したリクエストは、HTTP OPTIONSメソッドを使用しているため、プリフライトリクエストのように見えます。したがって、まずサーバーがOPTIONS要求を受け入れることを確認する必要があります(これはうまくいくはずですが、なぜ403を受け取ったのか説明できるかもしれません)。

次に、有効なプリフライト応答が必要です。 (これらの応答ヘッダがアクセス・コントロール・リクエスト・メソッドおよびアクセス制御リクエスト・ヘッダーのリクエストヘッダのエコーであるかを参照してください)

Access-Control-Allow-Methods: POST 
Access-Control-Allow-Headers: Origin,cache-control,content-type,man,messagetype,soapaction 

:プリフライトリクエストへの応答は、次の2つのヘッダをも含まれている必要があります。 Access-Control-Allow-Headersヘッダーには、カスタム要求ヘッダーが含まれている必要があります。

ブラウザはこの応答を受信すると、プリフライト要求が受け入れられたことを認識し、実際の要求を行います。 http://www.html5rocks.com/en/tutorials/cors/

+0

私は確かにそれを試してみましょう。それがうまくいかなければならない理由はなく、これは非常に包括的な対応です。どうもありがとう。 – Javanerd

関連する問題