2012-06-25 20 views
12

Ha ottenuto questo messaggio di errore: Refused to set unsafe header "Origin"rifiutato di fissare un colpo di testa pericoloso "Origine" quando si usa xmlHttpRequest di Google Chrome

utilizzando questo codice:

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

      } 
     } 

Che cosa sto facendo di sbagliato? Cosa mi manca nell'intestazione per far funzionare questa richiesta CORS?

Ho provato a rimuovere la chiamata receiveReq.setRequestHeader("Origin", ...) ma poi Google Chrome getta un errore di accesso sul mio receiveReq.open() chiamata ...

Perché?

risposta

14

Questa è solo un'ipotesi, poiché utilizzo jquery per richieste Ajax, incluso CORS.

Penso che il browser debba impostare l'intestazione, non tu. Se si fosse in grado di impostare l'intestazione, ciò avrebbe vanificato lo scopo della funzione di sicurezza.

Prova la richiesta senza impostare quelle intestazioni e controlla se il browser le imposta per te.

+0

Sì: basta eliminare il codice che imposta l'intestazione della richiesta "Origin" - funziona perfettamente per me! –

-6

Stai lavorando su più domini?

Prova soluzione Brian S o provare questo:

invece di impostare a localhost solo passare nulla ... e vedere cosa succede.

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

Rifiutato di impostare l'intestazione non sicura "Origine" –

6

In CORS il codice chiamante non deve eseguire alcuna configurazione speciale. Tutto dovrebbe essere gestito dal browser. È compito del server decidere se la richiesta debba essere autorizzata o meno. Quindi, ogni volta che si effettua una richiesta che interrompe il criterio SOP, il browser proverà a fare una richiesta CORS per te (aggiungerà automaticamente l'intestazione Origin e probabilmente farà una richiesta di verifica preliminare se stai usando alcune intestazioni/metodi/tipi di contenuto non sicuri). Se il server supporta CORS risponderà correttamente e consentire/non consentire la richiesta fornendo CORS intestazioni di risposta specifici come

Access-Control-Allow-Origin: * 

Tenete a mente che Chrome è molto restrittiva riguardo 'localhost' nome host. (Almeno era quando stavo lavorando con esso). Usa invece il nome del tuo computer o assegnagli un altro alias nel file "hosts". Così, per esempio, non accedere al sito come:

http://localhost:port/myappname 

invece utilizzare:

http://mymachinename:port/myappname 

o

http://mymachinealias:port/myappname 

Per maggiori informazioni si prega di specification.