来自
JavaScript的Cross Site XMLHttpRequest可以完成吗?
我明白了限制,为什么它不是一般能够工作,但是从firefox 3.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);
}
这是发送正确的请求头
请求
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在请求中指定的,服务器接受任何(“*”)域的响应.
为什么我得到“禁止403”,因为我觉得我所做的一切都是正确的,我不明白为什么?
有其他人得到这个吗?
你知道是什么原因吗
解决方法
CORS请求实际上由两个物理HTTP请求组成:1)预检请求,2)实际请求.您上面发布的请求类似于预检要求,因为它使用HTTP OPTIONS方法.所以您首先要做的是验证您的服务器是否接受OPTIONS请求(我相信这应该只是工作,但这可能解释了为什么您收到403).
接下来,您需要一个有效的预检反应.对预检要求的响应还必须包含以下两个标题:
Access-Control-Allow-Methods: POST Access-Control-Allow-Headers: Origin,cache-control,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/