Можно ли использовать XMLHttpRequest в разных доменах? - PullRequest
10 голосов
/ 15 декабря 2011

Кросс-сайт XMLHttpRequest из JavaScript можно ли это сделать?

Я понимаю ограничения и почему он вообще не может работать, но в 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);

}

Отправляет правильный заголовок запроса

ЗАПРОС

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

и получение заголовка ожидаемого ответа

RESPONSE

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" какЯ чувствую, что все, что я сделал, правильно, я не могу понять, почему?

Кто-нибудь еще получает это?

Вы знаете, что вызывает это?

1 Ответ

4 голосов
/ 16 декабря 2011

Запрос CORs на самом деле состоит из двух физических HTTP-запросов: 1) предварительный запрос и 2) фактический запрос. Запрос, который вы разместили выше, выглядит как предварительный запрос, поскольку он использует метод HTTP OPTIONS. Поэтому первое, что вам нужно сделать, это убедиться, что ваш сервер принимает запросы OPTIONS (я думаю, это должно сработать, но это может объяснить, почему вы получаете 403).

Далее вам нужен действительный предполетный ответ. Ответ на запрос предварительной проверки также должен содержать следующие два заголовка:

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

(Посмотрите, как эти заголовки ответа являются эхом заголовков запроса Access-Control-Request-Method и Access-Control-Request-Headers). Заголовок Access-Control-Allow-Headers должен содержать любые пользовательские заголовки запроса.

Как только браузер получает этот ответ, он знает, что предварительный запрос был принят, и выполняет фактический запрос. По фактическому запросу вам нужен только следующий заголовок:

Access-Control-Allow-Origin: *

Подробнее о предварительных запросах и обработке запросов CORS можно узнать здесь: http://www.html5rocks.com/en/tutorials/cors/

...