Можно ли использовать XMLHttpRequest через домены

Кросс-сайт 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

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

РЕАКЦИЯ

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

Запрос 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/