Nagłówki żądania kontroli dostępu są dodawane do nagłówka w żądaniu AJAX za pomocą jQuery

404

Chciałbym dodać niestandardowy nagłówek do żądania AJAX POST z jQuery.

Próbowałem tego:

$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "My-First-Header":"first value",
        "My-Second-Header":"second value"
    }
    //OR
    //beforeSend: function(xhr) { 
    //  xhr.setRequestHeader("My-First-Header", "first value"); 
    //  xhr.setRequestHeader("My-Second-Header", "second value"); 
    //}
}).done(function(data) { 
    alert(data);
});

Kiedy wysyłam to żądanie i oglądam w FireBug, widzę ten nagłówek:

OPCJE xxxx / rrrr
Host HTTP / 1.1 : 127.0.0.1:6666
Użytkownik-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko / 20100101 Firefox / 11.0
Zaakceptuj: tekst / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8
Accept-Language: fr, fr-fr; q = 0,8, en-us; q = 0,5, en; q = 0,3
Kodowanie Accept: gzip, deflate
Połączenie: zachowaj -alive
Pochodzenie: null
Access-Control-Request-Method: POST
Access-Control-Request-Headers: mój-pierwszy-nagłówek, mój-drugi-nagłówek
Pragma: brak pamięci
podręcznej Kontrola pamięci podręcznej: brak pamięci podręcznej

Dlaczego moje niestandardowe nagłówki idą do Access-Control-Request-Headers:

Access-Control-Request-Headers: mój-pierwszy-nagłówek, mój-drugi-nagłówek

Spodziewałem się takich wartości nagłówka:

My-First-Header: pierwsza wartość
My-Second-Header: druga wartość

Czy to możliwe?

fingerup
źródło
W tytule pytania należy podać, że „For Other Domain”
Księgowy

Odpowiedzi:

138

To, co zobaczyłeś w Firefoksie, nie było rzeczywistym żądaniem; zwróć uwagę, że metoda HTTP to OPCJE, a nie POST. W rzeczywistości była to prośba „przed lotem”, którą przeglądarka wysyła, aby ustalić, czy należy zezwolić na żądanie AJAX między domenami:

http://www.w3.org/TR/cors/

Nagłówek Kontrola dostępu-Żądanie-Nagłówki w żądaniu przed lotem zawiera listę nagłówków w rzeczywistym żądaniu. Serwer powinien następnie zgłosić, czy te nagłówki są obsługiwane w tym kontekście, czy nie, zanim przeglądarka prześle rzeczywiste żądanie.

Karlgold
źródło
438

Oto przykład, jak ustawić nagłówek żądania w wywołaniu Ajax jQuery:

$.ajax({
  type: "POST",
  beforeSend: function(request) {
    request.setRequestHeader("Authority", authorizationToken);
  },
  url: "entities",
  data: "json=" + escape(JSON.stringify(createRequestObject)),
  processData: false,
  success: function(msg) {
    $("#results").append("The result =" + StringifyPretty(msg));
  }
});
Milkovsky
źródło
10
dzięki, wiem, wysłać zapytanie Ajax z niestandardowym nagłówkiem. Mój problem dotyczy innej domeny. Wszystkie moje niestandardowe nagłówki są umieszczane w nagłówkach kontroli dostępu. to tylko bezpieczeństwo w przeglądarce: między domenami.
fingerup
tak, w przeglądarkach żądania między domenami mogą powodować pewne trudności. zawsze możesz użyć jakiegoś skryptu proxy do wysyłania żądań między domenami
milkovsky
Jak dodać nagłówki za pomocą API KEY?
Si8
@ Si8 sprawdź ten post stackoverflow.com/questions/5517281/...
milkovsky
178

Poniższy kod działa dla mnie. Zawsze używam tylko pojedynczych cudzysłowów i działa dobrze. Sugeruję, abyś używał tylko pojedynczych cudzysłowów lub tylko podwójnych cudzysłowów, ale nie pomieszaj ich.

$.ajax({
    url: 'YourRestEndPoint',
    headers: {
        'Authorization':'Basic xxxxxxxxxxxxx',
        'X-CSRF-TOKEN':'xxxxxxxxxxxxxxxxxxxx',
        'Content-Type':'application/json'
    },
    method: 'POST',
    dataType: 'json',
    data: YourData,
    success: function(data){
      console.log('succes: '+data);
    }
  });
Wykres
źródło
1
dzięki, wiem, wysłać zapytanie Ajax z niestandardowym nagłówkiem. Mój problem dotyczy innej domeny. Wszystkie moje niestandardowe nagłówki są umieszczane w nagłówkach kontroli dostępu. to tylko bezpieczeństwo w przeglądarce: między domenami.
fingerup
Dzięki, ustawiłem przypadkowo nagłówki: „Authorization: Basic XXXXXX”, a iOS 9 / Safari 9 rzucał SyntaxError DOM 12 na projekt.
Mark
4
Masz na myśli podwójne lub pojedyncze cytaty? Nie sądzę, żeby ktokolwiek użyłby podwójnych nawiasów.
DBS
3
Podwójne lub pojedyncze cudzysłowy (nie „nawiasy”) nie mają tu nic do roboty.
Pere
jego X-CSRF-TOKEN dla Laravela 5.6 i nowszych
Abdul Rahman A Samad
12

Ponieważ wysyłasz niestandardowe nagłówki, aby Twoje żądanie CORS nie było prostym żądaniem , więc przeglądarka najpierw wysyła żądanie OPCJI w ramach inspekcji wstępnej, aby sprawdzić, czy serwer zezwala na Twoje żądanie.

Wpisz opis zdjęcia tutaj

Jeśli włączysz CORS na serwerze, Twój kod będzie działał. Zamiast tego możesz również użyć pobierania JavaScript ( tutaj )

Oto przykładowa konfiguracja, która włącza CORS na nginx (plik nginx.conf):

Oto przykładowa konfiguracja, która włącza CORS na Apache (plik .htaccess)

Kamil Kiełczewski
źródło
3

I dlatego nie możesz stworzyć bota za pomocą JavaScript, ponieważ twoje opcje są ograniczone do tego, co pozwala ci przeglądarka. Nie możesz po prostu zamówić przeglądarki, która jest zgodna z zasadami CORS , których przestrzega większość przeglądarek, aby wysyłać losowe żądania do innych źródeł i pozwalać na proste uzyskanie odpowiedzi!

Ponadto, jeśli spróbujesz ręcznie edytować niektóre nagłówki żądań, na przykład origin-headerz narzędzi programistycznych dostarczanych z przeglądarkami, przeglądarka odmówi edycji i może wysłać OPTIONSżądanie inspekcji wstępnej .

księgowy
źródło
-10

Spróbuj użyć klejnotu rack-cors . I dodaj pole nagłówka do połączenia Ajax.

Jie Sun
źródło