Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可以跨域使用XMLHttpRequest吗_Javascript_Ajax_Browser_Cross Domain - Fatal编程技术网

Javascript 可以跨域使用XMLHttpRequest吗

Javascript 可以跨域使用XMLHttpRequest吗,javascript,ajax,browser,cross-domain,Javascript,Ajax,Browser,Cross Domain,从JavaScript跨站点XMLHttpRequest可以完成吗 我理解它的局限性,以及为什么它不能正常工作,但在Firefox3.5中有 访问控制允许原点: 这应该能让它起作用 它告诉浏览器,服务器不关心请求是否从未提供页面服务的域发送给它 下面是我正在使用的代码 function sendData(webservicePayload, callbackFunction) { var request = null; if (!window.XMLHttpRequest) { // code

从JavaScript跨站点XMLHttpRequest可以完成吗

我理解它的局限性,以及为什么它不能正常工作,但在Firefox3.5中有

访问控制允许原点:

这应该能让它起作用

它告诉浏览器,服务器不关心请求是否从未提供页面服务的域发送给它

下面是我正在使用的代码

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);
以及接收预期的响应报头

响应

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,服务器响应时接受任何(“*”)域

为什么我会被“禁止403”因为我觉得我所做的一切都是正确的,我不知道为什么

还有人收到这个吗


你知道是什么引起的吗?

一个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-Allow-Origin: *

您可以在此处了解有关飞行前请求和处理CORS请求的更多信息:

浏览器,并非所有浏览器都支持CORS。对于IE,您需要使用XDomainRequest而不是XMLHTTPRequest。但是,是的,跨域XHR工作得非常好,例如,我使用它从我的站点向imgur发送数据。我建议使用一个库来把这些讨厌的细节提取出来。看起来更像是服务器问题,而不是JS/浏览器问题。检查是否正确处理选项请求的APS代码。正如您从标题中看到的,我正在使用Firefox 8.0用户代理:Mozilla/5.0(Windows NT 6.1;rv:8.0)Gecko/20100101 Firefox/8.0此解决方案应该是通用的,因此我将更改IE8I的XDomainRequest的代码,肯定会尝试一下。没有理由不应该这样做,这是一个非常全面的回应。非常感谢。
Access-Control-Allow-Origin: *