Heim > Artikel > Web-Frontend > Eine kurze Diskussion über Preflight-Anfragen
Ich weiß nicht, ob Ihnen aufgefallen ist, dass wir manchmal beim Aufrufen der Hintergrundschnittstelle danach fragen Wie unten gezeigt
Tatsächlich ist das erste Mal, dass die Preflight-Anfrage gesendet wird, daher wird in diesem Artikel erläutert, warum und wann die Preflight-Anfrage gesendet werden soll Eine Preflight-Anfrage wird gesendet und was wird in der Preflight-Anfrage getan?
Wir alle kennen die Same-Origin-Richtlinie des Browsers, die der Sicherheit dient Aus Gründen schränkt der Server domänenübergreifende HTTP-Anfragen ein, die von Skripten wie XMLHttpRequest und Fetch initiiert werden, die der Same-Origin-Richtlinie folgen.
Es gibt im Allgemeinen zwei Möglichkeiten für Browser, domänenübergreifende Anfragen einzuschränken:
1. Der Browser schränkt die Initiierung domänenübergreifender Anfragen ein.
2 werden vom Browser abgefangen
Im Allgemeinen beschränken Browser domänenübergreifende Anforderungen auf die zweite Art und Weise, was bedeutet, dass die Anforderung den Server erreicht hat und möglicherweise die Daten in der Datenbank verarbeitet hat, das zurückgegebene Ergebnis jedoch abgefangen wurde vom Browser, dann können wir das Rückgabeergebnis nicht abrufen. Dies ist eine fehlgeschlagene Anfrage, die jedoch Auswirkungen auf die Daten in der Datenbank haben kann.
Um dies zu verhindern, verlangt die Spezifikation, dass der Browser für diese HTTP-Anfragemethode, die Nebenwirkungen auf Serverdaten haben kann, zunächst die OPTIONS
-Methode verwenden muss, um eine Preflight-Anfrage zu initiieren, um festzustellen, ob Der Server lässt die domänenübergreifende Anfrage zu: Wenn dies zulässig ist, senden Sie die echte Anfrage mit Daten. Wenn nicht, verhindern Sie, dass die echte Anfrage mit Daten gesendet wird.
HTTP-Anfragen umfassen: einfache Anfragen und Anfragen, die einen Preflight erfordern
Einfache Anfragen CORS-Preflight Anfrage wird nicht ausgelöst, „Jane gehört zu
Der Begriff „einzelne Anfrage“ gehört nicht zur Fetch-Spezifikation (wo CORS definiert ist).
Eine Anfrage kann als „einfache Anfrage“ betrachtet werden, wenn alle der folgenden Bedingungen erfüllt sind:
- Verwenden Sie eine der folgenden Methoden:
- GET
- HEAD
- POST
- Content-Type
: (Nur wenn der Content-Type-Wert der POST-Methode einem der folgenden entspricht, gilt dies als einfache Anforderung)
-
-
- text/plain
multipart/form-data
application/x-www-form-urlencoded
Hinweis:
, Accept-Languageverwenden, um eine Preflight-Anfrage an den Servicebereich zu initiieren, um zu erfahren, ob der Server Erlauben Sie die eigentliche Anfrage. Durch den Einsatz von „Preflight Request“ kann vermieden werden, dass domänenübergreifende Anfragen unerwartete Auswirkungen auf Benutzerdaten auf dem Server haben. Eine Preflight-Anfrage sollte zuerst gesendet werden, wenn die Anfrage eine der folgenden Bedingungen erfüllt:und Content-Language . Werte fügen zusätzliche Einschränkungen hinzu. Wenn die Werte dieser Header-Felder „nicht standardmäßig“ sind, behandelt WebKit/Safari diese Anfragen nicht als „einfache Anfragen“. WebKit/Safari listet in der Dokumentation nicht auf, welche Werte „nicht standardmäßig“ sind, aber wir können eine Diskussion hier finden: Require preflight for non-standard CORS-safelisted request headers Accept, Accept-Language, and Content-Language, Erlauben Sie Kommas in den Anforderungsheadern Accept, Accept-Language und Content-Language für einfache CORS und wechseln Sie zu einem Blacklist-Modell für eingeschränkte Accept-Header in einfachen CORS-Anfragen. Andere Browser unterstützen diese zusätzlichen Einschränkungen nicht, da sie nicht Teil der Spezifikation sind.
„Anfragen, die einen Preflight erfordern“ erfordern, dass Sie zuerst die Methode
2. Anfragen, die einen Preflight erfordern
- Eine der folgenden HTTP-Methoden verwendet: OPTIONS
-
-
- PUT
- DELETE
- CONNECT
- OPTIONS
- Künstlich andere Headerfelder als der CORS-sichere Headerfeldsatz gesetzt. Das Set ist: TRACE
-
PATCH
-
- Accept
- Accept-Language
- Content-Language
- Content-Type
- DPR
- Downlink
- Save-Data
– Der Wert von Viewport-Width
ist keiner der folgenden:
- - Width
- - Content-Type
- - application/x-www-form-urlencoded
Das Folgende ist eine HTTP-Anfrage, die eine Preflight-Anfrage ausführen muss:
var invocation = new XMLHttpRequest(); var url = ' var body = '<?xml version="1.0"?><person><name>Arun</name></person>';function callOtherDomain(){ if(invocation) { invocation.open('POST', url, true); invocation.setRequestHeader('X-PRODUCT', 'H5'); invocation.setRequestHeader('Content-Type', 'application/xml'); invocation.onreadystatechange = handler; invocation.send(body); } } ......
Der obige Code verwendet eine POST-Anfrage, um ein XML-Dokument zu senden, das ein benutzerdefiniertes Header-Feld enthält (X-PRODUCT: H5). Darüber hinaus lautet das Content-Type
für diese Anfrage application/xml
. Daher muss die Anfrage zunächst eine „Preflight-Anfrage“ initiieren.
1. OPTIONS /resources/post-here/ 2. HTTP/1.13. Host: bar.other4. User-Agent: Mozilla/5.0 (Macintosh; U; 5.Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.87. Accept-Language: en-us,en;q=0.58. Accept-Encoding: gzip,deflate9. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.710. Connection: keep-alive11. Origin: http://foo.example12. Access-Control-Request-Method: POST13. Access-Control-Request-Headers: X-PINGOTHER, Content-Type14. HTTP/1.1 200 OK15. Date: Mon, 01 Dec 2008 01:15:39 GMT16. Server: Apache/2.0.61 (Unix)17. Access-Control-Allow-Origin: http://foo.example18. Access-Control-Allow-Methods: POST, GET, OPTIONS19. Access-Control-Allow-Headers: X-PINGOTHER, Content-Type20. Access-Control-Max-Age: 8640021. Vary: Accept-Encoding, Origin22. Content-Encoding: gzip23. Content-Length: 024. Keep-Alive: timeout=2, max=10025. Connection: Keep-Alive26. Content-Type: text/plain
Wie Sie der obigen Nachricht entnehmen können, senden die Zeilen 1 bis 12 eine Preflight-Anfrage mit der Methode OPTIONS
. OPTIONS
ist eine im HTTP/1.1-Protokoll definierte Methode, um weitere Informationen vom Server zu erhalten. Diese Methode hat keine Auswirkungen auf Serverressourcen. Die Anfrage trägt gleichzeitig die folgenden zwei Header-Felder:
Access-Control-Request-Method: POST Access-Control-Request-Headers: X-PRODUCT
Das Header-Feld Access-Control-Request-Method teilt dem Server mit, dass die eigentliche Anfrage die POST-Methode verwenden wird. Das Header-Feld Access-Control-Request-Headers teilt dem Server mit, dass die eigentliche Anfrage zwei benutzerdefinierte Anfrage-Header-Felder enthält: X-PINGOTHER und Content-Type. Auf dieser Grundlage entscheidet der Server, ob die tatsächliche Anfrage zulässig ist.
Die Zeilen 14 bis 26 sind Antworten auf die Preflight-Anfrage und geben an, dass der Server bei nachfolgenden tatsächlichen Anfragen bleibt. Konzentrieren Sie sich auf die Zeilen 17–20:
Access-Control-Allow-Origin: http://foo.exampleAccess-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-PINGOTHER, Content-TypeAccess-Control-Max-Age: 86400
Das Header-Feld Access-Control-Allow-Methods
gibt an, dass der Server dem Client erlaubt, Anfragen mithilfe der Methoden POST, GET und OPTIONS zu initiieren. Das
-Header-Feld Access-Control-Allow-Headers
gibt an, dass der Server die Übertragung der Felder X-PINGOTHER
und Content-Type
in der Anfrage zulässt. Wie Access-Control-Allow-Methods
ist der Wert von Access-Control-Allow-Headers
eine durch Kommas getrennte Liste.
Schließlich gibt das Header-Feld
Access-Control-Max-Age
an, dass die Antwort 86400 Sekunden lang gültig ist, also 24 Stunden. Innerhalb des Gültigkeitszeitraums muss der Browser für dieselbe Anfrage keine erneute Preflight-Anfrage initiieren. Bitte beachten Sie, dass der Browser selbst eine maximale Gültigkeitsdauer einhält. Wenn der Wert dieses Header-Felds die maximale Gültigkeitsdauer überschreitet, wird es nicht wirksam.
Nachdem die Preflight-Anfrage abgeschlossen ist, senden Sie die eigentliche Anfrage:
POST /resources/post-here/ HTTP/1.1Host: bar.otherUser-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3preAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-us,en;q=0.5Accept-Encoding: gzip,deflateAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Connection: keep-aliveX-PINGOTHER: pingpongContent-Type: text/xml; charset=UTF-8Referer: http://foo.example/examples/preflightInvocation.htmlContent-Length: 55Origin: http://foo.examplePragma: no-cacheCache-Control: no-cache<?xml version="1.0"?><person><name>Arun</name></person>HTTP/1.1 200 OK Date: Mon, 01 Dec 2008 01:15:40 GMT Server: Apache/2.0.61 (Unix) Access-Control-Allow-Origin: http://foo.example Vary: Accept-Encoding, Origin Content-Encoding: gzip Content-Length: 235 Keep-Alive: timeout=2, max=99 Connection: Keep-Alive Content-Type: text/plain [Some GZIP'd payload]
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über Preflight-Anfragen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!