摘要:同源策略在中有一個(gè)很重要的安全性限制,被稱為同源策略。然而,當(dāng)進(jìn)行一些比較深入的前端編程的時(shí)候,不可避免地需要進(jìn)行跨域操作,這時(shí)候同源策略就顯得過(guò)于苛刻。
JSONP原理 JSON和JSONP
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式。對(duì)于JSON大家應(yīng)該是很了解了吧,不是很清楚的朋友可以去json.org上了解下,簡(jiǎn)單易懂。
JSONP是JSON with Padding的略稱。它是一個(gè)非官方的協(xié)議,它允許在服務(wù)器端集成Scripttags返回至客戶端,通過(guò)javascriptcallback的形式實(shí)現(xiàn)跨域訪問(wèn)(這僅僅是JSONP簡(jiǎn)單的實(shí)現(xiàn)形式)。
JSONP就像是JSON+Padding一樣(Padding這里我們理解為填充),我們先看下面的小例子然后再詳細(xì)介紹。
同源策略在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-OriginPolicy”(同源策略)。這一策略對(duì)于JavaScript代碼能夠訪問(wèn)的頁(yè)面內(nèi)容做了很重要的限制,即JavaScript只能訪問(wèn)與包含它的文檔在同一域下的內(nèi)容。
根據(jù)這個(gè)策略,在baidu.com下的頁(yè)面中包含的JavaScript代碼,不能訪問(wèn)在google.com域名下的頁(yè)面內(nèi)容;甚至不同的子域名之間的頁(yè)面也不能通過(guò)JavaScript代碼互相訪問(wèn)。對(duì)于Ajax的影響在于,通過(guò)XMLHttpRequest實(shí)現(xiàn)的Ajax請(qǐng)求,不能向不同的域提交請(qǐng)求,例如,在abc.example.com下的頁(yè)面,不能向def.example.com提交Ajax請(qǐng)求,等等。然而,當(dāng)進(jìn)行一些比較深入的前端編程的時(shí)候,不可避免地需要進(jìn)行跨域操作,這時(shí)候“同源策略”就顯得過(guò)于苛刻。
然而html中有一些元素是不存在跨域問(wèn)題的如:script,iframe等元素,利用這些元素,就能很好的解決這個(gè)問(wèn)題.
JSONP的實(shí)現(xiàn)方式利用在頁(yè)面中創(chuàng)建 //通過(guò)加載example2的JS文件來(lái)達(dá)到函數(shù)調(diào)用和數(shù)據(jù)傳遞
?example2.com的test.js內(nèi)容如下
//回調(diào)函數(shù) callback({name:"張三"});
以上這種方法只是一個(gè)簡(jiǎn)單實(shí)現(xiàn)原因的例子,現(xiàn)實(shí)中我們的數(shù)據(jù)和回調(diào)也不會(huì)都寫死在JS中的,所以我們要想辦法將這些靜態(tài)的東西動(dòng)態(tài)生成就可以了.只要將example1.com srcipt 地址改為一個(gè)能動(dòng)態(tài)生成JS調(diào)用方法的服務(wù)地址即可.如:
test.do Controller直接返回如下
callback(數(shù)據(jù)庫(kù)客戶信息的JSON對(duì)象);
例子如下:當(dāng)然對(duì) createScript("http://B.com/search.do?&callback=displayCustomer");
B網(wǎng)站的后臺(tái)實(shí)現(xiàn):
@Controller public classJsonpRest { ????@RequestMapping(value = "/test.do",method = RequestMethod.GET) ??? public @ResponseBody Stringlist(HttpServletRequest request) { ??????? returnrequest.getParameter("callback")+"({name:"張三",age:18})"; ??? } }
JSONP的優(yōu)點(diǎn)是:
它不像XMLHttpRequest對(duì)象實(shí)現(xiàn)的Ajax請(qǐng)求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中都可以運(yùn)行,不需要XMLHttpRequest或ActiveX的支持;并且在請(qǐng)求完畢后可以通過(guò)調(diào)用callback的方式回傳結(jié)果。
JSONP的缺點(diǎn)則是:
它只支持GET請(qǐng)求而不支持POST等其它類型的HTTP請(qǐng)求;它只支持跨域HTTP請(qǐng)求這種情況,不能解決不同域的兩個(gè)頁(yè)面之間如何進(jìn)行JavaScript調(diào)用的問(wèn)題。
沒(méi)有關(guān)于 JSONP調(diào)用的錯(cuò)誤處理。如果動(dòng)態(tài)腳本插入有效,就執(zhí)行調(diào)用;如果無(wú)效,就靜默失敗。失敗是沒(méi)有任何提示的。例如,不能從服務(wù)器捕捉到404 錯(cuò)誤,也不能取消或重新開(kāi)始請(qǐng)求。不過(guò),等待一段時(shí)間還沒(méi)有響應(yīng)的話,就不用理它了。
JQUERY對(duì)JSONP的支持從JQery 1.2以后,就開(kāi)始支持JSONP的調(diào)用。JQuery對(duì)前臺(tái)做了很好的處理如自動(dòng)生成全局回調(diào)函數(shù)等,但后臺(tái)還需要開(kāi)發(fā)人員自己實(shí)現(xiàn).
$.getJSON("http://跨域的dns/xxx.do?callback=?",function(json){?? ? ? ? ? ? ??// 業(yè)務(wù)邏輯執(zhí)行代碼 });
請(qǐng)求URL?
http://xxx.com/rest.do?callba..._1332575486681&_=1393510789026
$.ajax({ ? ? ? ?url:"http://xxx.com/rest.do", ? ? ? ? dataType:"jsonp", ??//必須指定 ? ? ? ? jsonp : "c", ? ? ? ?//若不指定則默認(rèn)為callback ? ? ? ??jsonpCallback:"test",//若不指定則Jquery自己生成隨機(jī)的名稱 ? ? ? ? success:function(data){ ? ? ? ? ? ??//業(yè)務(wù)邏輯執(zhí)行代碼 ? ? ? ? } });
請(qǐng)求URL?http://xxx.com/rest.do?c=test&_=1393510789026
當(dāng)dataType為JSONP時(shí),JQUERY會(huì)為用戶生成一個(gè)全局函數(shù)名稱為jsonpCallback參數(shù)的值,這個(gè)函數(shù)內(nèi)部調(diào)用了success方法JQUERY的實(shí)現(xiàn)原理及步驟
以GET方式請(qǐng)求目標(biāo)地址,并在URL中拼接以jsonp參數(shù)值為key,以jsonpCallback值為value的參數(shù)
請(qǐng)求返回回調(diào)函數(shù)數(shù)據(jù)
觸發(fā)調(diào)用全局的回調(diào)函數(shù),在全局函數(shù)回調(diào)中調(diào)用success方法并將數(shù)據(jù)傳遞給success方法
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96388.html
摘要:上節(jié)我們講了同源策略,這節(jié)我們講講如何跨域。當(dāng)這些從的腳本執(zhí)行出錯(cuò),因?yàn)檫`背了同源策略為了保證用戶信息不被泄露,錯(cuò)誤信息不會(huì)顯示出來(lái),取而代之只會(huì)返回一個(gè)。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開(kāi)發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水平,打牢基礎(chǔ)知識(shí)的中心思想,我們開(kāi)課啦(每...
摘要:同源策略限制了我們無(wú)法通過(guò)原生的對(duì)象獲取到數(shù)據(jù)。的原理其實(shí)不復(fù)雜瀏覽器的同源策略把跨域請(qǐng)求都禁止了的標(biāo)簽是例外,可以突破同源策略從其他來(lái)源獲取數(shù)據(jù)由上可得,我們可以通過(guò)標(biāo)簽引入文件,然后通過(guò)一系列操作獲取數(shù)據(jù)。上面三點(diǎn)便是實(shí)現(xiàn)跨域的原理。 今天做頁(yè)面時(shí),后臺(tái)給了個(gè)接口:https://a.a.com/a/a.json,我頁(yè)面的上線地址是:http://b.b.com。顯而易見(jiàn),因?yàn)闉g覽...
摘要:前提是的方法名與引入的文件方法名一致。簡(jiǎn)單描述就是先定義一個(gè)方法,然后引入外部調(diào)用這個(gè)方法并攜帶數(shù)據(jù)。 JSONP 被用于跨域獲取數(shù)據(jù)。在講解它之前,先講講它與 JSON 之間的區(qū)別 什么是JSON? JSON 是一種基于文本的數(shù)據(jù)交換方式,或者叫做數(shù)據(jù)描述格式。 其優(yōu)點(diǎn)是: 1、基于純文本,跨平臺(tái)傳遞極其簡(jiǎn)單; 2、Javascript 原生支持,后臺(tái)語(yǔ)言幾乎全部支持; 3、輕量級(jí)數(shù)...
摘要:,跨站腳本攻擊。實(shí)際發(fā)的請(qǐng)求就是,用于表示這是一個(gè)請(qǐng)求。,用于告知服務(wù)器根據(jù)這個(gè)參數(shù)獲取回調(diào)函數(shù)的名稱,通常約定就叫。,回調(diào)函數(shù)的名稱,也是前面參數(shù)的值,可省略,會(huì)自動(dòng)生成。 本次課程主要圍繞 PHP 面試和筆試中經(jīng)常會(huì)出現(xiàn)的一些知識(shí)點(diǎn),但是面試官會(huì)在筆試題基礎(chǔ)上深入擴(kuò)展,那么你知道如何更好的回答讓面試官滿意嗎?題目收集自騰訊,迅雷,美圖等公司的筆試面試題,以及本人面試經(jīng)歷中印象中的知...
摘要:運(yùn)行一下頁(yè)面,成功彈出提示窗口,的執(zhí)行全過(guò)程順利完成到這里為止的話,相信你已經(jīng)能夠理解的客戶端實(shí)現(xiàn)原理了吧剩下的就是如何把代碼封裝一下,以便于與用戶界面交互,從而實(shí)現(xiàn)多次和重復(fù)調(diào)用。 先說(shuō)說(shuō)JSONP是怎么產(chǎn)生的: 其實(shí)網(wǎng)上關(guān)于JSONP的講解有很多,但卻千篇一律,而且云里霧里,對(duì)于很多剛接觸的人來(lái)講理解起來(lái)有些困難,小可不才,試著用自己的方式來(lái)闡釋一下這個(gè)問(wèn)題,看看是否有幫助。 1、...
閱讀 3120·2023-04-26 03:01
閱讀 3562·2023-04-25 19:54
閱讀 1629·2021-11-24 09:39
閱讀 1402·2021-11-19 09:40
閱讀 4289·2021-10-14 09:43
閱讀 2169·2019-08-30 15:56
閱讀 1520·2019-08-30 13:52
閱讀 1683·2019-08-29 13:05