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?

Fingerup
quelle
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.

Karlgold
quelle
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));
  }
});
melkowski
quelle
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);
    }
  });
Graph
quelle
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)

Kamil Kiełczewski
quelle
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.

der Buchhalter
quelle
-10

Versuchen Sie, das Rack-Cors- Juwel zu verwenden. Fügen Sie das Header-Feld in Ihren Ajax-Aufruf ein.

Jie Sun.
quelle