Intestazioni richieste controllo accesso, viene aggiunto all'intestazione nella richiesta AJAX con jQuery


405

Vorrei aggiungere un'intestazione personalizzata a una richiesta POST AJAX da jQuery.

Ho provato questo:

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

Quando invio questa richiesta e guardo con FireBug, vedo questa intestazione:

OPZIONI xxxx / yyyy
Host HTTP / 1.1 : 127.0.0.1:6666
User-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko / 20100101 Firefox / 11.0
Accetta: text / 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
Accept-Encoding: gzip, deflate
Connessione: keep -alive
Origine: null
Accesso-Controllo-Richiesta-Metodo: POST
Accesso-Controllo-Richiesta-Intestazioni: my-first-header, my-second-header
Pragma: no-cache
Controllo cache: no-cache

Perché le mie intestazioni personalizzate vanno a Access-Control-Request-Headers:

Access-Control-Request-Headers: my-first-header, my-second-header

Mi aspettavo un valore di intestazione come questo:

My-First-Header: primo valore
My-Second-Header: secondo valore

È possibile?



Il titolo della domanda dovrebbe indicare che "Per altri domini"
Contabile م

Risposte:


138

Quello che hai visto in Firefox non è stata la vera richiesta; si noti che il metodo HTTP è OPTIONS, non POST. In realtà era la richiesta "pre-volo" che il browser invia per determinare se una richiesta AJAX tra domini dovrebbe essere consentita:

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

L'intestazione Access-Control-Request-Headers nella richiesta pre-volo include l'elenco di intestazioni nella richiesta effettiva. Si prevede quindi che il server riporti se queste intestazioni sono supportate o meno in questo contesto, prima che il browser invii la richiesta effettiva.


438

Ecco un esempio di come impostare un'intestazione di richiesta in una chiamata 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
grazie, so inviare la richiesta Ajax con intestazione personalizzata. Il mio problema è con domini diversi. Tutte le mie intestazioni personalizzate sono inserite in Access-Control-Request-Headers. è solo sicurezza nel browser: interdominio.
fingerup

sì, nelle richieste tra domini diversi del browser possono causare alcune difficoltà. puoi sempre utilizzare alcuni script proxy per inviare le tue richieste tra domini
milkovsky,

Come faccio ad aggiungere le intestazioni con API KEY?
Si8,

@ Si8 si prega di controllare questo post stackoverflow.com/questions/5517281/...
milkovsky

178

Questo codice qui sotto funziona per me. Uso sempre solo virgolette singole e funziona benissimo. Ti suggerisco di usare solo virgolette singole o solo virgolette doppie, ma non confuse.

$.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
grazie, so inviare la richiesta Ajax con intestazione personalizzata. Il mio problema è con domini diversi. Tutte le mie intestazioni personalizzate sono inserite in Access-Control-Request-Headers. è solo sicurezza nel browser: interdominio.
fingerup

Grazie, avevo impostato le intestazioni: "Autorizzazione: Basic XXXXXX" per errore e iOS 9 / Safari 9 lanciava SyntaxError DOM 12 su un progetto.
Segna il

4
Intendi le virgolette doppie o singole? Non penso che nessuno userebbe le doppie parentesi.
DBS,

3
Le virgolette doppie o singole (non "parentesi") non hanno nulla da fare qui.
Pere

il suo X-CSRF-TOKEN per il Laravel 5.6 e versioni successive
Abdul Rahman A Samad

12

Poiché invii intestazioni personalizzate in modo che la tua richiesta CORS non sia una semplice richiesta , il browser invia prima una richiesta OPTIONS di verifica preliminare per verificare che il server accetti la tua richiesta.

Inserisci qui la descrizione dell'immagine

Se si attiva CORS sul server, il codice funzionerà. Puoi anche usare JavaScript fetch ( qui )

Ecco una configurazione di esempio che attiva CORS su nginx (file nginx.conf):

Ecco una configurazione di esempio che attiva CORS su Apache (file .htaccess)


3

Ecco perché non puoi creare un bot con JavaScript, perché le tue opzioni sono limitate a ciò che il browser ti consente di fare. Non puoi semplicemente ordinare un browser che segue la politica CORS , seguita dalla maggior parte dei browser, per inviare richieste casuali ad altre origini e consentirti di ottenere la risposta semplicemente!

Inoltre, se si è tentato di modificare manualmente alcune intestazioni di richiesta, ad esempio origin-headerdagli strumenti per sviluppatori forniti con i browser, il browser rifiuterà la modifica e potrebbe inviare una OPTIONSrichiesta di verifica preliminare .


-10

Prova a usare la gemma rack-cors . E aggiungi il campo dell'intestazione nella tua chiamata Ajax.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.