2012-06-25 14 views
12

Haben Sie diese Fehlermeldung mit: Refused to set unsafe header "Origin"Refused unsicher Header "Origin" zu setzen, wenn XMLHttpRequest von Google Chrome

Mit diesem Code:

function getResponse() { 
      document.getElementById("_receivedMsgLabel").innerHTML += "getResponse() called.<br/>"; 
      if (receiveReq.readyState == 4 || receiveReq.readyState == 0) { 
       receiveReq.open("GET", "http://L45723:1802", true, "server", "server123"); //must use L45723:1802 at work. 
       receiveReq.onreadystatechange = handleReceiveMessage; 
       receiveReq.setRequestHeader("Origin", "http://localhost/"); 
       receiveReq.setRequestHeader("Access-Control-Request-Origin", "http://localhost"); 
       receiveReq.timeout = 0; 
       var currentDate = new Date(); 
       var sendMessage = JSON.stringify({ 
        SendTimestamp: currentDate, 
        Message: "Message 1", 
        Browser: navigator.appName 
       }); 
       receiveReq.send(sendMessage); 

      } 
     } 

Was mache ich falsch? Was fehlt mir in der Kopfzeile, damit diese CORS-Anfrage funktioniert?

Ich habe versucht, das Entfernen der receiveReq.setRequestHeader("Origin", ...) Anruf aber dann Google Chrome löst eine Zugriffsfehler auf meinem receiveReq.open() Anruf ...

Warum?

Antwort

14

Dies ist nur eine Vermutung, wie ich jquery für AJAX-Anfragen, einschließlich CORS verwenden.

Ich denke, der Browser soll den Header setzen, nicht Sie. Wenn Sie die Kopfzeile festlegen könnten, würde dies den Zweck der Sicherheitsfunktion beeinträchtigen.

Versuchen Sie die Anfrage, ohne diese Header zu setzen und sehen Sie, ob der Browser sie für Sie einstellt.

+0

Ja: Löschen Sie einfach Ihren Code, der die Anforderungsheader "Origin" setzt - funktioniert gut für mich! –

-6

Arbeiten Sie domänenübergreifend?

Versuchen Brian S Lösung oder versuchen Sie dies:

statt nur der Einstellung passieren zu localhost etwas ... und sehen, was passiert.

receiveReq.setRequestHeader("Origin", "*"); 
+1

Weigerte, unsicheren Header "Origin" festzulegen –

6

In CORS muss der aufrufende Code keine spezielle Konfiguration vornehmen. Alles sollte vom Browser gehandhabt werden. Es ist die Aufgabe des Servers, zu entscheiden, ob eine Anfrage erlaubt sein soll oder nicht. Wenn Sie also eine Anfrage stellen, die die SOP-Richtlinie bricht, versucht der Browser, eine CORS-Anfrage für Sie zu stellen (Origin wird automatisch hinzugefügt und möglicherweise eine Preflight-Anfrage gestellt, wenn Sie unsichere Header/Methoden/Inhaltstypen verwenden)). Wenn der Server CORS unterstützt wird es richtig reagieren und erlauben/verbieten die Anforderung von CORS spezifische Antwort-Header wie

Access-Control-Allow-Origin: * 

Denken Sie daran, vorausgesetzt, dass Chrome ist sehr restriktiv zu ‚localhost‘ Hostnamen. (Zumindest war es, als ich damit arbeitete). Verwenden Sie stattdessen Ihren Computernamen oder weisen Sie ihm einen anderen Alias ​​in der Datei 'Hosts' zu. So zum Beispiel, wie nicht auf Ihre Website zugreifen:

http://localhost:port/myappname 

Stattdessen verwenden:

http://mymachinename:port/myappname 

oder

http://mymachinealias:port/myappname 

weitere Details zu den bitte specification überprüfen.