Header für Zugriffssteuerungsanforderungen werden dem Header in AJAX-Anforderungen mit jQuery hinzugefügt


404

Ich möchte einer AJAX POST-Anfrage von jQuery einen benutzerdefinierten Header hinzufügen.

Ich habe das versucht:

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

Wenn ich diese Anfrage sende und mit FireBug schaue, sehe ich diesen Header:

OPTIONEN xxxx / yyyy HTTP / 1.1
Host: 127.0.0.1:6666
User-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko / 20100101 Firefox / 11.0
Akzeptieren: text / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8
Akzeptieren-Sprache: fr, fr-fr; q = 0,8, en-us; q = 0,5, en; q = 0,3
Akzeptieren-Codierung: gzip, entleeren
Verbindung: behalten -alive
Herkunft: null
Zugriffssteuerungs-Anforderungsmethode: POST
Zugriffssteuerungs-Anforderungs-Header: Mein-erster-Header, mein-zweiter-Header
Pragma: kein Cache
Cache-Kontrolle: kein Cache

Warum gehen meine benutzerdefinierten Header zu Access-Control-Request-Headers:

Access-Control-Request-Header: Mein-erster-Header, mein-zweiter-Header

Ich hatte folgende Header-Werte erwartet:

My-First-Header: erster Wert
My-Second-Header: zweiter Wert

Ist es möglich?



Der Titel der Frage sollte lauten: "Für andere Domänen"
Buchhalter

Antworten:


138

Was Sie in Firefox gesehen haben, war nicht die eigentliche Anfrage. Beachten Sie, dass die HTTP-Methode OPTIONS und nicht POST ist. Es war tatsächlich die Anforderung vor dem Flug, die der Browser stellt, um zu bestimmen, ob eine domänenübergreifende AJAX-Anforderung zulässig sein soll:

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

Der Header "Access-Control-Request-Headers" in der Anforderung vor dem Flug enthält die Liste der Header in der tatsächlichen Anforderung. Es wird dann erwartet, dass der Server zurückmeldet, ob diese Header in diesem Kontext unterstützt werden oder nicht, bevor der Browser die eigentliche Anforderung sendet.


438

Hier ist ein Beispiel zum Festlegen eines Anforderungsheaders in einem jQuery Ajax-Aufruf:

$.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
thx, ich weiß, senden Ajax-Anfrage mit benutzerdefinierten Header. Mein Problem ist mit einer anderen Domäne. Alle meine benutzerdefinierten Header werden in Access-Control-Request-Headern abgelegt. Es ist nur Sicherheit im Browser: domänenübergreifend.
Fingerup

Ja, im Browser können domänenübergreifende Anfragen einige Schwierigkeiten verursachen. Sie können immer ein Proxy-Skript verwenden, um Ihre domänenübergreifenden Anfragen zu senden
Milkovsky

Wie füge ich die Header mit API KEY hinzu?
Si8

@ Si8 bitte überprüfen Sie diesen Beitrag stackoverflow.com/questions/5517281/…
Milkovsky

178

Dieser Code unten funktioniert für mich. Ich verwende immer nur einfache Anführungszeichen und es funktioniert gut. Ich schlage vor, Sie sollten nur einfache oder nur doppelte Anführungszeichen verwenden, aber nicht verwechselt.

$.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
thx, ich weiß, senden Ajax-Anfrage mit benutzerdefinierten Header. Mein Problem ist mit einer anderen Domäne. Alle meine benutzerdefinierten Header werden in Access-Control-Request-Headern abgelegt. Es ist nur Sicherheit im Browser: domänenübergreifend.
Fingerup

Vielen Dank, ich hatte versehentlich Header gesetzt: "Authorization: Basic XXXXXX", und iOS 9 / Safari 9 warf SyntaxError DOM 12 auf ein Projekt.
Mark

4
Meinen Sie doppelte oder einfache Anführungszeichen? Ich glaube nicht, dass jemand doppelte Klammern verwenden würde.
DBS

3
Doppelte oder einfache Anführungszeichen (keine "Klammern") haben hier nichts zu tun.
Pere

seine X-CSRF-Marke für die Laravel 5.6 und höher
Abdul Rahman A Samad

12

Da Sie benutzerdefinierte Header senden, sodass Ihre CORS-Anforderung keine einfache Anforderung ist , sendet der Browser zunächst eine Preflight-OPTIONS-Anforderung, um zu überprüfen, ob der Server Ihre Anforderung zulässt.

Geben Sie hier die Bildbeschreibung ein

Wenn Sie CORS auf dem Server aktivieren, funktioniert Ihr Code. Sie können stattdessen auch JavaScript-Abruf verwenden ( hier )

Hier ist eine Beispielkonfiguration, die CORS unter nginx (Datei nginx.conf) aktiviert:

Hier ist eine Beispielkonfiguration, die CORS in Apache aktiviert (.htaccess-Datei)


3

Aus diesem Grund können Sie mit JavaScript keinen Bot erstellen, da Ihre Optionen auf die Möglichkeiten des Browsers beschränkt sind. Sie können nicht einfach einen Browser bestellen, der der CORS- Richtlinie folgt , der die meisten Browser folgen, um zufällige Anfragen an andere Ursprünge zu senden und die Antwort so einfach zu erhalten!

Wenn Sie versucht haben, einige Anforderungsheader manuell zu bearbeiten, z. B. origin-headervon den mit den Browsern gelieferten Entwicklertools, lehnt der Browser Ihre Bearbeitung ab und sendet möglicherweise eine Preflight- OPTIONSAnforderung.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.