Ich habe schon lange keinen Aufsatz mehr geschrieben und habe immer das Gefühl, keine Zeit zu haben, aber tatsächlich ist Zeit... Genug Unsinn, vor ein paar Tagen gab es eine neue Anforderung bei der Arbeit, die verlangte, dass die Frontend-Webseite die Backend-Webservice-Methode asynchron aufruft, um Informationen zurückzugeben. Es gibt viele Möglichkeiten, das zu implementieren, dieses Beispiel verwendet jQuery+Ajax, nach Abschluss ist alles in Ordnung, lokal zu debuggen, aber es gibt ein Problem nach der Bereitstellung auf dem Server und der Hintergrund-Serviceaufruf reagiert nicht – was passiert da? Der Code hat sich kaum verändert, das Einzige, was sich geändert hat, ist die URL-Adresse in jQuerys Ajax-Methode. Könnte es sein, dass das Problem darin besteht, dass nach Überprüfung und Debugging herauskommt, dass die homologe Richtlinie schuld ist; wir wissen, dass Javascrip{filtering}t oder jQuery eine dynamische Skripttechnik ist, die häufig in der Web-Frontend-Entwicklung verwendet wird. In Javascrip{filtering}t gibt es eine wichtige Sicherheitsbeschränkung, die als "Same-Origin-Policy" bekannt ist. Diese Richtlinie legt eine wichtige Einschränkung auf den Inhalt der Seite fest, auf den Javascrip{filter}t-Code zugreifen kann, d. h. Javascrip{filtering}t kann nur auf Inhalte unter demselben Domainnamen wie das Dokument oder Skript zugreifen, das es enthält. Skripte unter verschiedenen Domänen können nicht aufeinander zugreifen, nicht einmal auf Subdomänen. Bezüglich der homologen Strategie können Leser sie auf Baidu ausführlicher erklären, was hier nicht wiederholt wird.
Aber manchmal ist es unvermeidlich, domänenübergreifende Operationen durchzuführen, und die "homologe Politik" ist eine Einschränkung – was sollten wir tun? Schauen wir uns an, wie JSONP domänenübergreifend implementiert wird, und diskutieren das Prinzip der JSONP-Grenzenüberschreitung.
JSONP wird hier erwähnt, dann fragte jemand, was der Unterschied und der Unterschied zwischen ihm und JSON ist. Schauen wir uns das an, die Baidu-Enzyklopädie hat folgende Erklärung:
JSON (Javascrip{filtering}t Object Notation) ist ein leichtgewichtiges Datenaustauschformat. Sie basiert auf einer Teilmenge von Javascrip{filter}t (Standard ECMA-262, 3. Edition – Dezember 1999). JSON verwendet ein vollständig sprachunabhängiges Textformat, verwendet aber auch Gewohnheiten ähnlich der C-Familie (darunter C, C++, C#, Java, Javascrip, Perl, Python usw.). Diese Funktionen machen JSON zu einer idealen Sprache für den Datenaustausch. Leicht von Menschen zu lesen und zu schreiben, aber auch leicht von der Maschine zu analysieren und zu generieren (schnelle Netzwerkübertragung).
JSONP (JSON mit Padding) ist ein "Nutzungsmuster" von JSON, das verwendet werden kann, um das Problem des domänenübergreifenden Datenzugriffs in Mainstream-Browsern zu lösen. Aufgrund der Same-Origin-Richtlinie können Seiten, die sich in der Regel auf server1.example.com befinden, nicht mit Servern kommunizieren, die nicht server1.example.com sind, mit Ausnahme des Elements <scrip{filter}t> von HTML. Mit dieser offenen Strategie des Elements <scrip{filter}t> können Webseiten dynamisch generierte JSON-Daten aus anderen Quellen erhalten, und dieses Nutzungsmuster ist als JSONP bekannt. Die mit JSONP erfassten Daten sind kein JSON, sondern beliebiger Javascrip{filter}t, der mit dem Javascrip{filter}t-Übersetzer ausgeführt wird, anstatt vom JSON-Parser geparst zu werden.
An diesem Punkt sollte verstanden werden, dass JSON ein leichtgewichtiges Datenaustauschformat ist, ähnlich wie XML, das verwendet wird, um Daten zwischen Daten zu beschreiben. JSONP ist eine Möglichkeit, JSON-Daten zu verwenden, und anstatt ein JSON-Objekt zurückzugeben, handelt es sich um ein javascrip{filtering}t-Skript, das ein JSON-Objekt enthält.
Wie funktioniert JSONP? Wir wissen, dass XmlHttpRequest aufgrund der Einschränkungen der Same-Origin-Richtlinie nur Anfragen für Ressourcen vom aktuellen Quellcode (Domainname, Protokoll, Port) erlaubt. Domänenübergreifende Anfragen sind aus Sicherheitsgründen nicht möglich, aber wir haben festgestellt, dass js-Dateien, die auf Webseiten aufgerufen werden, nicht von domänenübergreifenden Dateien betroffen sind oder nicht, und Tags mit dem Attribut "src" domänenübergreifende Funktionen besitzen, wie <scrip{filter}t>, <img>, ,<iframe>Wenn Sie eine domänenübergreifende Anfrage stellen möchten, stellen Sie eine domänenübergreifende Anfrage mit dem Scrip{filter}t-Tag von html und geben Sie den scrip{filtering}t-Code zurück, der in der Antwort ausgeführt werden soll, wobei Sie JSON direkt verwenden können, um das Objekt javascrip{filter}t weiterzugeben. Das heißt, JSON-Daten auf dem domänenübergreifenden Server zu erzeugen und sie dann in ein scrip{filtering}t-Skript zurückzupacken, was die Beschränkungen der Same-Origin-Richtlinie durchbricht und das Problem des domänenübergreifenden Zugriffs löst.
Schauen wir uns an, wie man das erreicht:
Frontend-Code:
|