webentwicklung-frage-antwort-db.com.de

CORS - Wie kann ein httprequest "Preflight" durchgeführt werden?

Ich versuche, eine domänenübergreifende HTTP-Anforderung an den WCF-Dienst (den ich besitze) zu erstellen. Ich habe verschiedene Techniken zum Arbeiten mit den Einschränkungen des domänenübergreifenden Skripts gelesen. Da mein Dienst sowohl GET- als auch POST -Anforderungen erfüllen muss, kann ich keine dynamischen Skript-Tags implementieren, deren Src die URL einer GET-Anforderung ist. Da ich frei am Server Änderungen vornehmen kann, habe ich mit dem Versuch begonnen, eine Problemumgehung zu implementieren, bei der die Serverantworten so konfiguriert werden, dass sie den Header "Access-Control-Allow-Origin" und "Preflight" -Anfragen mit der Option OPTIONS enthalten. Ich habe die Idee aus diesem Post bekommen: CORS zum Laufen bringen

Auf der Serverseite fügt meine Webmethode der HTTP-Antwort "Access-Control-Allow-Origin: *" hinzu. Ich kann sehen, dass die Antworten jetzt diesen Header enthalten. Meine Frage ist: Wie kann ich eine Anfrage "Preflight" machen (OPTIONS)? Ich verwende jQuery.getJSON, um die GET-Anfrage zu stellen, aber der Browser bricht die Anfrage sofort mit dem infamen ab:

Origin http: // localhost ist für Access-Control-Allow-Origin nicht zulässig

Kennt jemand diese CORS-Technik? Welche Änderungen müssen am Kunden vorgenommen werden, um meine Anfrage vorab zu überprüfen?

Vielen Dank!

86
Nick

Während der Preflight-Anfrage sollten die folgenden zwei Header angezeigt werden: Access-Control-Request-Methode und Access-Control-Request-Header. Diese Anforderungsheader bitten den Server um Berechtigungen, um die tatsächliche Anforderung auszuführen. Ihre Preflight-Antwort muss diese Header bestätigen, damit die eigentliche Anforderung funktioniert.

Angenommen, der Browser fordert eine Anforderung mit den folgenden Kopfzeilen an:

Origin: http://yourdomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header

Ihr Server sollte dann mit den folgenden Kopfzeilen antworten:

Access-Control-Allow-Origin: http://yourdomain.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: X-Custom-Header

Achten Sie besonders auf den Antwortheader Access-Control-Allow-Header. Der Wert dieses Headers sollte den gleichen Headern im Request-Header der Access-Control-Request-Headers entsprechen. Er darf nicht '*' sein. 

Sobald Sie diese Antwort an die Preflight-Anfrage gesendet haben, stellt der Browser die eigentliche Anfrage. Mehr über CORS erfahren Sie hier: http://www.html5rocks.com/de/tutorials/cors/

142
monsur

Obwohl dieser Thread aus dem Jahr 2014 stammt, kann die Ausgabe für viele von uns aktuell sein. So habe ich es in einem jQuery 1.12/PHP 5.6-Kontext behandelt:

  • jQuery hat seine XHR-Anfrage nur mit begrenzten Headern gesendet. Es wurde nur "Origin" gesendet. 
  • Es war keine Preflight-Anfrage erforderlich.
  • Der Server musste nur eine solche Anfrage erkennen und "Access-Control-Allow-Origin:" hinzufügen. $ _SERVER ['HTTP_Origin'] Header, nachdem erkannt wurde, dass es sich um einen Cross-Origin XHR handelt.

PHP Code Beispiel:

if (!empty($_SERVER['HTTP_Origin'])) {
    // Uh oh, this XHR comes from outer space...
    // Use this opportunity to filter out referers that shouldn't be allowed to see this request
    if (!preg_match('@\.partner\.domain\[email protected]'))
        die("End of the road if you're not my business partner.");

    // otherwise oblige
    header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_Origin']);
}
else {
    // local request, no need to send a specific header for CORS
}

Fügen Sie insbesondere keinen exit; hinzu, da kein Preflight erforderlich ist.

0
Fabien Haddadi