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?



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.


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

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


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

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)


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 .


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.