2011-12-16 35 views
7

Pytam usługę sieci Web REST, która używa niestandardowych nagłówków HTTP do uwierzytelniania.

Jeśli wykonuję POST bez nagłówków, otrzymuję oczekiwany błąd, ale kiedy dodaję nagłówki, otrzymuję błąd 404 zamiast tego, czego potrzebuję.

To jest mój kod

$.ajax({ 
    type: 'POST', 
    url: 'http://server.com/service', 
    beforeSend: function (xhr) { xhr.setRequestHeader('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE') }, 
    success: function(data) {  
    alert('success.'); 
    } 
}); 

Oto Firebug nagłówki wyjście:

OPCJE/usługa HTTP/1.1 Host : server.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 8.0.1) Gecko/20100101 Firefox/8.0.1 Zaakceptuj: tekst/html, aplikacja/xhtml + xml, aplikacja/xml; q = 0.9, /; q = 0,8 Zaakceptuj język: en-us, en; q = 0.5 Zaakceptuj kodowanie: gzip, deflate Zaakceptuj kod: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7 Połączenie: zachowaj -alive Pochodzenie: null Access-Control-Request-Method: PO Access-Control-Request-Główki custom-header-key Pragma: no-cache cache-Control: no-cache

oraz nagłówki smae podczas wykonywania postu z plakatem, który zwraca pożądany wynik.

POST/usługa HTTP/1.1 Host : server.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 8.0.1) Gecko/20100101 Firefox/8.0.1 Zaakceptuj: text/html, application/xhtml + xml, application/xml; q = 0.9, /; q = 0.8 Zaakceptuj język: en-us, en; q = 0.5 Zaakceptuj kodowanie: gzip, deflate Akceptuj-zestaw znaków: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7 Połączenie: podtrzymywanie przy życiu KLUCZ NACZYŃ WŁASNYCH: NOWA NA ZAMÓWIENIE Pragma: no-cache Cache-Control: no-cache Content-Length: 0

Różnica jest dość oczywiste, ale nie wiem, co robię źle w kodzie jQuery.

Czy ktoś może mi pomóc?

+1

Czy wysłaniu 'prośbę Post' między serwerami? – Blender

+0

Blender jest na dobrej drodze. Najprawdopodobniej jest to naruszenie sandbox. Uzyskaj dostęp do usługi VIA jsonp lub użyj serwera jako proxy do usługi. – John

+0

"i nagłówki smae podczas wykonywania postu z plakatem" .. czym jest "PLAKAT"? – humblelistener

Odpowiedz

1

To może lub nie może pomóc, ale myślę, że można dodać nagłówki w opcji danych:

$.ajax({ 
    type: 'POST', 
    data: put the results of your header request here, 
    url: 'http://server.com/service', 
    beforeSend: function (xhr) { xhr.setRequestHeader('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE') }, 
    success: function(data) {  
    alert('success.'); 
    } 
}); 
2

To Krzyż żądanie domeny. Więc nie możesz go rozwiązać ze strony przeglądarki. Do wykonania testu POST w innej domenie może być potrzebny serwer proxy po stronie serwera.

1

Wszystkie niestandardowe nagłówki połączeń międzydomenowych wywołują żądanie przed lotem, które jest połączeniem OPCJONALNYM. Musisz albo pominąć sprawdzanie bezpieczeństwa dla połączeń OPTIONS, albo obsłużyć żądania osobno, ponieważ niestandardowe nagłówki nie są przekazywane z żądaniem OPTIONS. Nie ma również szkody w dopuszczeniu wniosku przed lotem, ponieważ żadne rzeczywiste dane nie są przekazywane z powrotem do przeglądarki za pomocą tego połączenia.Zasadniczo przeglądarka prosi serwer, czy może wykonać to połączenie, zanim faktycznie go wykona. Może być również konieczne sprawdzenie nagłówków Kontroli dostępu. Wszystkie te zmiany są po stronie serwera, więc musisz mieć pełną kontrolę nad serwisem internetowym.

+0

Nawet zrozumienie, że wysyłanie nagłówków klientów na OPCJE nie ma sensu z perspektywy CORS ... Czy wiesz, czy istnieje hack lub obejście, aby dodać nagłówki klientów na żądanie OPTIONS? – juancancela

+0

Powiedziałem, że twoje niestandardowe nagłówki NIE są wysyłane z żądaniem OPTIONS. Zasadniczo jest to prosta prośba z pytaniem, czy można wykonać POST, PUT itp. Na tej ścieżce. I nie, nie ma obejścia do dodawania żadnych niestandardowych nagłówków do wywołań OPCJE, a przeglądarki nie pozwalają na to jako środek bezpieczeństwa. Zawsze możesz użyć JSONP, aby obejść ograniczenia CORS, ale będziesz musiał użyć parametrów zapytania, aby przekazać dowolne dane na serwer, ponieważ jest to tylko < script > GET –

5

w pole karne zamówienie domeny jeśli nagłówek nie jest dozwolone przez przeglądarkę usług będzie po prostu usunąć go

W przeglądarce pierwsza przeglądarka dokona połączenia opcję, aby sprawdzić dozwolonym (pochodzenie, nagłówki, metody)

W konfiguracji usługi musisz pozwolić nagłówek, aby być w stanie wysłać je do serwera przy użyciu

Access-Control-Allow-Headers: YOUR_HEADER_NAME 
Powiązane problemy