Отдавна не съм писал есе и винаги имам чувството, че нямам време, но всъщност времето е... Достатъчно глупости, преди няколко дни имаше ново изискване, което изискваше предната страница да извиква бекенд метода за уеб обслужване асинхронно, за да върне информация. Има много начини да се реализира, този пример използва jQuery+Ajax, след завършване всичко е наред за дебъгване локално, но има проблем след деплойминг на сървъра и фоновото повикване на услугата не реагира, какво се случва? Кодът не се е променил много, единственото, което се е променило, е URL адресът в ajax метода на jQuery. Възможно ли е проблемът тук да е, че след проверка и отстраняване на грешки се оказва, че хомологната политика е виновна, знаем, че Javascrip{filtering}t или jQuery е динамична техника за скриптиране, често използвана в уеб фронтенд разработката. В Javascrip{filtering}t съществува важно ограничение за сигурността, известно като "Политика за един и същи произход". Тази политика налага важно ограничение върху съдържанието на страницата, до което Javascrip{filter}t кодът може да достъпва, т.е. Javascrip{filtering}t може да достъпва съдържание само под същото домейн име като документа или скрипта, който го съдържа. Скриптовете под различни домейни не могат да имат достъп един до друг, дори поддомейните. Относно хомоложната стратегия, читателите могат да я обяснят по-подробно в Baidu, което тук няма да се повтори.
Но понякога е неизбежно да се извършват операции между домейните, а "хомологната политика" е ограничение – какво трябва да направим? Нека разгледаме как се реализира JSONP cross-domain и обсъдим принципа на JSONP cross-domain.
Тук се споменава JSONP, после някой попита каква е разликата и разликата между него и JSON, нека видим, Baidu Encyclopedia има следното обяснение:
JSON (Javascrip{filtering}t Object Notation) е лек формат за обмен на данни. Той е базиран на подмножество от Javascrip{filter}t (Стандарт ECMA-262, 3-то издание - декември 1999 г.). JSON използва напълно езиково независим текстов формат, но също така използва навици, подобни на семейството C (включително C, C++, C#, Java, Javascrip, Perl, Python и др.). Тези функции правят JSON идеален език за обмен на данни. Лесни за четене и писане от хора, но също така лесни за разбиране и генериране от машина (бърза мрежова трансмисия).
JSONP (JSON с подплата) е "модел на употреба" на JSON, който може да се използва за решаване на проблема с достъпа до данни между домейни в масовите браузъри. Поради политиката за един и същи произход, страниците, които обикновено се намират на server1.example.com, не могат да комуникират със сървъри, които не са server1.example.com, с изключение на елемента <scrip{filter}t> в HTML. Използвайки тази отворена стратегия на елемента <scrip{filter}t>, уеб страниците могат динамично да генерират JSON данни от други източници, като този модел на използване е известен като JSONP. Данните, събрани с JSONP, не са JSON, а произволен Javascrip{filter}t, който се изпълнява с преводача Javascrip{filter}t, вместо да се анализира от JSON парсера.
На този етап трябва да се разбере, че JSON е лек формат за обмен на данни, подобен на xml, който се използва за описание на данни между данни. JSONP е начин за използване на JSON данни, и вместо да връща JSON обект, той е javascrip{filtering}t скрипт, който съдържа JSON обект.
Как работи JSONP – знаем, че поради ограниченията на политиката за един и същи произход, XmlHttpRequest позволява заявки за ресурси само от текущия източник (домейн име, протокол, порт). Кросдомейн заявки не са възможни поради съображения за сигурност, но установихме, че когато js файловете се извикват на уеб страници, те не са засегнати от cross-domain или не, а тагове с атрибута "src" имат възможности за крос-домейн, като <scrip{filter}t>, <img>, ,<iframe>Ако искате да направите крос-домейн заявка, направете крос-домейн заявка чрез използване на тага scrip{filter}t на html и върнете scrip{filtering}t кода, който трябва да бъде изпълнен в отговора, при който можете директно да използвате JSON, за да предадете javascrip{filter}t обекта. Тоест, генериране на JSON данни на сървъра между домейните и след това обвиването им обратно в скрипт (filtering}t скрипт, което пробива ограниченията на политиката за същия произход и решава проблема с достъпа между домейни.
Нека разгледаме как да го постигнем:
Фронтенд код:
|