Ilgą laiką nerašiau esė ir visada jaučiu, kad neturiu laiko, bet iš tikrųjų laikas yra... Pakankamai nesąmonė, prieš kelias dienas darbe buvo naujas reikalavimas, kuris reikalavo, kad front-end tinklalapis asinchroniškai iškviestų backend Webservice metodą, kad grąžintų informaciją. Yra daugybė būdų, kaip tai įgyvendinti, šiame pavyzdyje naudojamas "jQuery+Ajax", baigus viskas gerai derinti vietoje, tačiau įdiegus serveryje kyla problema, o foninės paslaugos skambutis nereaguoja, kas vyksta? Kodas nepasikeitė daug, vienintelis dalykas, kuris pasikeitė yra URL adresas jQuery ajax metodas. Ar gali būti, kad problema čia yra ta, kad patikrinus ir derinant, paaiškėja, kad homologinė politika yra kalta, mes žinome, kad Javascrip{filtering}t arba jQuery yra dinaminė scenarijų technika, dažnai naudojama žiniatinklio front-end kūrime. Javascrip{filtering}t yra svarbus saugos apribojimas, žinomas kaip "Tos pačios kilmės politika". Ši strategija nustato svarbų puslapio, kurį gali pasiekti Javascrip{filter}t kodas, turinio apribojimą, t. y. Javascrip{filtering}t gali pasiekti turinį tik tuo pačiu domeno vardu kaip ir dokumentas arba scenarijus, kuriame jis yra. Skirtingų domenų scenarijai negali pasiekti vienas kito, net padomeniai. Kalbant apie homologinę strategiją, skaitytojai gali ją išsamiau paaiškinti "Baidu", kuri čia nebus pakartota.
Tačiau kartais neišvengiama atlikti kryžmines operacijas, o "homologinė politika" yra apribojimas, ką turėtume daryti? Pažvelkime, kaip įgyvendinamas JSONP kryžminis domenas, ir aptarkime JSONP kryžminio domeno principą.
Čia minimas JSONP, tada kažkas paklausė, kuo jis skiriasi nuo JSON, pažiūrėkime, Baidu enciklopedija turi tokį paaiškinimą:
JSON (Javascrip{filtering}t Object Notation) yra lengvas duomenų mainų formatas. Jis pagrįstas Javascrip{filter}t poaibiu (Standard ECMA-262 3rd Edition - 1999 m. gruodžio mėn.). JSON naudoja visiškai nuo kalbos nepriklausomą teksto formatą, tačiau taip pat naudoja įpročius, panašius į C šeimą (įskaitant C, C++, C#, Java, Javascrip, Perl, Python ir kt.). Dėl šių funkcijų JSON yra ideali kalba duomenų mainams. Lengva skaityti ir rašyti žmonėms, bet taip pat lengva analizuoti ir generuoti mašina (greitas tinklo perdavimas).
JSONP (JSON su užpildymu) yra JSON "naudojimo modelis", kuris gali būti naudojamas sprendžiant kelių domenų duomenų prieigos problemą pagrindinėse naršyklėse. Dėl tos pačios kilmės strategijos puslapiai, paprastai esantys server1.example.com, negali susisiekti su serveriais, kurie nėra server1.example.com, išskyrus HTML elementą <scrip{filter}t>. Naudojant šią atvirą <scrip{filter}t> elemento strategiją, tinklalapiai gali gauti JSON duomenis, dinamiškai generuojamus iš kitų šaltinių, ir šis naudojimo modelis yra žinomas kaip JSONP. JSONP užfiksuoti duomenys yra ne JSON, o savavališkas Javascrip{filter}t, kuris vykdomas naudojant Javascrip{filter}t vertėją, o ne analizuojamas JSON analizatoriaus.
Šiuo metu reikia suprasti, kad JSON yra lengvas duomenų mainų formatas, pvz., xml, naudojamas duomenims tarp duomenų apibūdinti. JSONP yra būdas naudoti JSON duomenis, o vietoj to, kad grąžintų JSON objektą, tai yra javascrip{filtering}t scenarijus, kuriame yra JSON objektas.
Taigi, kaip veikia JSONP, žinome, kad dėl tos pačios kilmės politikos apribojimų XmlHttpRequest leidžia tik užklausas dėl išteklių iš dabartinio šaltinio (domeno vardo, protokolo, prievado). Kryžminių domenų užklausos neįmanomos saugumo sumetimais, tačiau nustatėme, kad kai js failai iškviečiami tinklalapiuose, kryžminis domenas jiems neturi įtakos arba ne, o žymos su atributu "src" turi kryžminių domenų galimybes, pvz., <scrip{filter}t>, <img>, ,<iframe>Jei norite pateikti kryžminio domeno užklausą, pateikite kryžminio domeno užklausą naudodami html scrip{filter}t žymę ir grąžinkite scrip{filtering}t kodą, kuris bus vykdomas atsakyme, kuriame galite tiesiogiai naudoti JSON, kad perduotumėte javascrip{filter}t objektą. Tai yra, generuojant JSON duomenis kryžminio domeno serveryje ir įvyniojant juos į scrip{filtering}t scenarijų atgal, kuris pralaužia tos pačios kilmės politikos apribojimus ir išsprendžia kelių domenų prieigos problemą.
Pažvelkime, kaip tai pasiekti:
Priekinis kodas:
|