2012-06-25 15 views
12

Got to komunikat o błędzie: Refused to set unsafe header "Origin"Odmówił ustawić niebezpieczny nagłówek "pochodzenie", gdy za pomocą XMLHttpRequest Google Chrome

Stosując ten kod:

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

      } 
     } 

Co robię źle? Czego brakuje mi w nagłówku, aby to żądanie CORS działało?

Próbowałem usunięcie połączenia receiveReq.setRequestHeader("Origin", ...) ale Google Chrome zgłasza błąd dostępu na moim receiveReq.open() rozmowy ...

Dlaczego?

Odpowiedz

14

To tylko odgadnięcie, ponieważ używam jquery dla żądań ajax, w tym CORS.

Myślę, że przeglądarka ma ustawić nagłówek, nie ty. Jeśli byłbyś w stanie ustawić nagłówek, to pokonałoby to cel funkcji bezpieczeństwa.

Wypróbuj żądanie bez ustawiania tych nagłówków i sprawdź, czy przeglądarka je dla Ciebie ustawi.

+0

Tak: wystarczy usunąć kod, który ustawia nagłówek żądania "Pochodzenie" - działa doskonale dla mnie! –

-6

Czy pracujesz między domenami?

Spróbuj rozwiązanie Brian S lub spróbuj tego:

zamiast ustawiania localhost prostu przekazać coś ... i zobaczyć, co się dzieje.

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

Odrzucono ustawienie niebezpiecznego nagłówka "Pochodzenie" –

6

W CORS kod wywołujący nie musi wykonywać żadnej specjalnej konfiguracji. Wszystko powinno być obsługiwane przez przeglądarkę. Zadaniem serwera jest decyzja, czy żądanie powinno być dozwolone, czy nie. Tak więc za każdym razem, gdy wysyłasz żądanie, które łamie zasadę SOP, przeglądarka spróbuje utworzyć dla Ciebie żądanie CORS (automatycznie doda nagłówek Origin i ewentualnie wykona żądanie preflight jeśli używasz niebezpiecznych nagłówków/metod/typów treści). Jeśli serwer obsługuje CORS odpowie prawidłowo i akceptowania/odrzucania wniosku poprzez dostarczenie Cors specyficzne nagłówki odpowiedzi jak

Access-Control-Allow-Origin: * 

Należy pamiętać, że Chrome jest bardzo restrykcyjna o „localhost” nazwa hosta. (Przynajmniej było, kiedy pracowałem z tym). Zamiast tego użyj swojej nazwy komputera lub przypisz mu inny alias w pliku "hosts". Tak na przykład nie dostęp do witryny jak:

http://localhost:port/myappname 

Zamiast używać:

http://mymachinename:port/myappname 

lub

http://mymachinealias:port/myappname 

Aby uzyskać więcej informacji prosimy sprawdzić specification.

Powiązane problemy