Že dolgo nisem napisal eseja in vedno imam občutek, da nimam časa, a v resnici je čas... Dovolj neumnosti, pred nekaj dnevi je veljala nova zahteva, ki je zahtevala, da sprednja spletna stran asinhrono kliče metodo backend spletne storitve, da vrne informacije. Obstaja veliko načinov za implementacijo, ta primer uporablja jQuery+Ajax, po zaključku je vse v redu za lokalno odpravljanje napak, vendar se po namestitvi na strežnik pojavi težava in klic storitve v ozadju ni odziven, kaj se dogaja? Koda se ni veliko spremenila, edina stvar, ki se je spremenila, je URL naslov v jQueryjevi metodi ajax. Ali je morda težava tukaj v tem, da se po preverjanju in odpravljanju napak izkaže, da je homologna politika kriva; vemo, da je Javascrip{filtering}t ali jQuery dinamična skriptna tehnika, ki se pogosto uporablja v spletnem front-end razvoju. V Javascrip{filtering}t obstaja pomembna varnostna omejitev, znana kot "Politika istega izvora". Ta politika uvaja pomembno omejitev glede vsebine strani, do katere lahko dostopa Javascrip{filter}t koda, torej Javascrip{filtering}t lahko dostopa do vsebine le pod istim domenskim imenom kot dokument ali skripta, ki jo vsebuje. Skripte pod različnimi domenami ne morejo dostopati drug do drugega, niti do poddomen ne. Glede homologne strategije lahko bralci podrobneje razložijo na Baiduju, kar tukaj ne bo ponovljeno.
A včasih je neizogibno izvajati operacije med domenami, in "homologna politika" je omejitev – kaj naj storimo? Poglejmo, kako je implementiran JSONP meddomenski sistem in razpravljajmo o principu JSONP meddomenskega sistema.
JSONP je omenjen tukaj, nato pa je nekdo vprašal, kakšna je razlika in razlika med njim in JSON? Poglejmo si, Baidu enciklopedija ima naslednjo razlago:
JSON (Javascrip{filtering}t Object Notation) je lahek format za izmenjavo podatkov. Temelji na podmnožici Javascrip{filter}t (Standard ECMA-262, 3. izdaja - december 1999). JSON uporablja popolnoma jezikovno neodvisen format besedila, vendar uporablja tudi navade, podobne družini C (vključno s C, C++, C#, Java, Javascrip, Perl, Python itd.). Te lastnosti naredijo JSON idealen jezik za izmenjavo podatkov. Enostavno za branje in pisanje za ljudi, a tudi enostavno za razčlenjevanje in generiranje s strani računalnika (hiter prenos v omrežje).
JSONP (JSON z polnjenjem) je "vzorec uporabe" JSON-a, ki se lahko uporabi za rešitev problema dostopa podatkov med domenami v glavnih brskalnikih. Zaradi politike istega izvora strani, ki se običajno nahajajo na server1.example.com, ne morejo komunicirati s strežniki, ki niso server1.example.com, razen elementa <scrip{filter}t> v HTML. Z uporabo te odprte strategije elementa <scrip{filter}t> lahko spletne strani dinamično pridobijo JSON podatke iz drugih virov, ta vzorec uporabe pa je znan kot JSONP. Podatki, zajeti z JSONP, niso JSON, temveč poljubni Javascrip{filter}t, ki se izvaja z Javascrip{filter}t prevajalnikom namesto da bi ga razčlenjeval JSON.
Na tej točki je treba razumeti, da je JSON lahek format za izmenjavo podatkov, podobno kot xml, ki se uporablja za opis podatkov med podatki. JSONP je način uporabe JSON podatkov, in namesto da bi vrnil JSON objekt, je to skripta javascrip{filtering}t, ki vsebuje JSON objekt.
Kako torej deluje JSONP? Vemo, da zaradi omejitev politike istega izvora XmlHttpRequest dovoljuje zahteve za vire le iz trenutnega izvora (domena, protokol, port). Zahteve med domenami niso možne zaradi varnostnih razlogov, vendar smo ugotovili, da ko se js datoteke kličejo na spletnih straneh, niso prizadete glede na to, ali je med domenami ali ne, oznake z atributom "src" pa imajo zmogljivosti za meddomensko delovanje, kot so <scrip{filter}t>, <img>, ,<iframe>Če želite poslati zahtevo čez domene, jo naredite z uporabo oznake scrip{filter}t v html in vrnite kodo scrip{filtering}t, ki se izvede v odgovoru, kjer lahko neposredno uporabite JSON za posredovanje objekta javascrip{filter}t. To pomeni, da se JSON podatki generirajo na strežniku med domenami in jih nato zavijejo v scrip{filtering}t skripto nazaj, kar prebije omejitve politike istega izvora in reši problem dostopa med domenami.
Poglejmo, kako to doseči:
Sprednja koda:
|