2011-12-15 29 views
10

Cross Site XMLHttpRequest từ JavaScript có thể thực hiện được không?Có thể sử dụng XMLHttpRequest trên các Tên miền

Tôi hiểu những hạn chế và lý do tại sao nó không phải là thường có thể làm việc, nhưng như của firefox 3.5 có là

Access-Control-Allow-Origin: *

mà là vụ phải cho phép này để làm việc.

Nó cho trình duyệt biết rằng máy chủ không quan tâm nếu yêu cầu được gửi tới nó từ một miền không phục vụ trang.

Mã tôi đang sử dụng ở bên dưới.

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); 

}

này đang gửi các tiêu đề yêu cầu đúng

YÊU CẦU

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 

và nhận được phản ứng tiêu đề dự kiến ​​

ỨNG PHÓ

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 

Như bạn có thể thấy Orgin được chỉ định trong yêu cầu và máy chủ phản hồi với việc chấp nhận bất kỳ miền ("*") nào.

Tại sao tôi bị "Cấm 403" vì tôi cảm thấy rằng mọi thứ tôi đã làm là chính xác, tôi không thể giải thích tại sao?

Có ai khác nhận được thông báo này không?

Bạn có biết nguyên nhân gây ra nó không?

+2

trình duyệt, không phải tất cả các trình duyệt hỗ trợ CORS – Raynos

+0

Và đối với IE bạn cần sử dụng XDomainRequest thay cho XMLHTTPRequest.Nhưng vâng, cross XHR hoạt động rất tốt, tôi sử dụng nó để gửi dữ liệu đến imgur từ trang web của tôi chẳng hạn. Tôi khuyên bạn nên sử dụng một thư viện để trừu tượng hóa các chi tiết khó chịu. –

+0

Dường như vấn đề máy chủ hơn là vấn đề về JS/trình duyệt. Kiểm tra mã APS của bạn đang xử lý yêu cầu OPTIONS một cách chính xác. – Gerben

Trả lời

3

Yêu cầu COR thực sự bao gồm hai yêu cầu HTTP vật lý: 1) Yêu cầu preflight và 2) yêu cầu thực tế. Yêu cầu bạn đã đăng ở trên trông giống như yêu cầu preflight, vì nó được sử dụng phương pháp HTTP OPTIONS. Vì vậy, điều đầu tiên bạn phải làm là xác minh rằng máy chủ của bạn chấp nhận các yêu cầu OPTIONS (tôi tin rằng điều này sẽ chỉ hoạt động, nhưng nó có thể giải thích tại sao bạn nhận được 403).

Tiếp theo, bạn cần phản hồi preflight hợp lệ. Việc đối phó với một yêu cầu preflight cũng phải có hai tiêu đề sau:

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

(Xem cách các tiêu đề phản ứng là một tiếng vang của Access-Control-Yêu cầu-Phương pháp và tiêu đề yêu cầu Access-Control-Yêu cầu-Headers) . Tiêu đề Access-Control-Allow-Headers phải chứa bất kỳ tiêu đề yêu cầu tùy chỉnh nào.

Khi trình duyệt nhận được phản hồi này, nó biết rằng yêu cầu preflight đã được chấp nhận và yêu cầu thực tế. Theo yêu cầu thực tế, bạn chỉ cần tiêu đề sau đây:

Access-Control-Allow-Origin: * 

Bạn có thể tìm hiểu thêm về các yêu cầu preflight và xử lý CORS yêu cầu ở đây: http://www.html5rocks.com/en/tutorials/cors/

+0

Tôi chắc chắn sẽ cho nó một thử. Không có lý do tại sao nó không nên làm việc và đây là một phản ứng rất toàn diện. Cảm ơn nhiều. – Javanerd

Các vấn đề liên quan