JSONP跨域總結(jié)

什么是跨域

  • 請(qǐng)求協(xié)議(http,https)不同
  • 域名(domain)不同
  • 端口(port)不同

更詳細(xì)的說(shuō)明可以看下表:

URL 說(shuō)明 是否允許通信
http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允許
http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夾 允許
http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允許
http://www.a.com/a.js https://www.a.com/b.js 同一域名,不同協(xié)議 不允許
http://www.a.com/a.js http://70.32.92.74/b.js 域名和域名對(duì)應(yīng)ip 不允許
http://www.a.com/a.js http://script.a.com/b.js 主域相同睬涧,子域不同 不允許
http://www.a.com/a.js http://a.com/b.js 同一域名碘赖,不同二級(jí)域名(同上) 不允許(cookie這種情況下也不允許訪(fǎng)問(wèn))
http://www.cnblogs.com/a.js http://www.a.com/b.js 不同域名 不允許

跨域解決方案之 JSONP

Jsonp (JSON with Padding) 是 json 的一種"使用模式"诺祸,可以讓網(wǎng)頁(yè)從別的域名(網(wǎng)站)那獲取資料晒杈,即跨域讀取數(shù)據(jù)论悴。

由于跨域的存在计贰,使資源交互在不同域名間變的復(fù)雜和安全钦睡。對(duì)于跨域數(shù)據(jù)傳輸,當(dāng)數(shù)據(jù)長(zhǎng)度較小(get的長(zhǎng)度內(nèi))躁倒,jsonp是一種較好的解決方案荞怒。

為什么我們從不同的域(網(wǎng)站)訪(fǎng)問(wèn)數(shù)據(jù)需要一個(gè)特殊的技術(shù)(JSONP )呢洒琢?這是因?yàn)?strong>瀏覽器同源策略,它是由Netscape提出的一個(gè)著名的安全策略褐桌,現(xiàn)在所有支持JavaScript 的瀏覽器都會(huì)使用這個(gè)策略衰抑。

Jsonp的原理是利用 <script> 元素的開(kāi)放策略,網(wǎng)頁(yè)可以得到從其他來(lái)源動(dòng)態(tài)獲取的 JSON 數(shù)據(jù)荧嵌,數(shù)據(jù)被包裹在一個(gè)JavaScript 函數(shù)中呛踊。

jsonp的js端調(diào)用

主要功能:通過(guò)jsonp向服務(wù)器,調(diào)用相應(yīng)接口啦撮,獲應(yīng)數(shù)據(jù)谭网;根據(jù)獲取數(shù)據(jù)結(jié)果做出相應(yīng)回調(diào)。

<script type="text/javascript">
    $(function () {
        alert("start...");
        $.ajax({
            type: "get",
            // 這個(gè)就是不同于當(dāng)前域的一個(gè)URL地址
            url: "http://your_site_url", 
            dataType: "jsonp",
            //傳遞給請(qǐng)求處理程序或頁(yè)面的赃春,用以獲得jsonp回調(diào)函數(shù)名的參數(shù)名(默認(rèn)為:callback)
            jsonp: "callback",  
            //自定義的jsonp回調(diào)函數(shù)名稱(chēng)愉择,默認(rèn)為jQuery自動(dòng)生成的隨機(jī)函數(shù)名
            // jsonpcallback與上面的jsonp值一致
            jsonpCallback:"success_jsonpCallback",
            data: "name=admin",  
            success : function(json){//返回的json數(shù)據(jù)
                console.log(josn.message);//回調(diào)輸出
                alert('success');
            },
            error:function(){
                alert('fail');
            }
        });
    alert("end...");
});
</script>

jsonp 服務(wù)器端 (php)

<?php
$data = ".......";
$callback = $_GET['callback'];
echo $callback.'('.json_encode($data).')';
exit;
?>

Jsonp使用注意事項(xiàng)

1.安全問(wèn)題

JSONP可能會(huì)引起 CSRF(Cross-site request forgery 跨站請(qǐng)求偽造)攻擊或 XSS (Cross Site Scripting 跨站腳本攻擊)漏洞。

對(duì)于支持 JSONP的接口织中,寫(xiě)接口時(shí)數(shù)據(jù)可能會(huì)被篡改锥涕,讀接口時(shí)數(shù)據(jù)可能會(huì)被劫持。

XSS示例:

輸出 JSON 時(shí)狭吼,沒(méi)有嚴(yán)格定義好Content-Type(Content-Type: application/json)直接導(dǎo)致了一個(gè)典型的 XSS 漏洞:

http://127.0.0.1/getUsers.php?callback=<script>alert(/xss/)</script>

2.傳值問(wèn)題

使用Jsonp進(jìn)行跨域請(qǐng)求层坠,只能通過(guò)GET請(qǐng)求傳值!5篌稀窿春!

可以從Josnp的原理來(lái)理解:

JSONP的最基本的原理是動(dòng)態(tài)添加一個(gè)<script>標(biāo)簽,而script標(biāo)簽的src屬性是沒(méi)有跨域的限制的采盒。這樣說(shuō)來(lái),這種跨域方式其實(shí)與ajax XmlHttpRequest協(xié)議無(wú)關(guān)了蔚润。
可以說(shuō)jsonp的方式原理上和<script src="http://跨域/...xx.js"></script>是一致的磅氨,因?yàn)樗脑韺?shí)際上就是 使用jsscript標(biāo)簽 進(jìn)行傳參,那么必然是get方式的了嫡纠,和瀏覽器中敲入一個(gè)url一樣烦租。

預(yù)先定義callback函數(shù)

function myfunc(data) {
   console.log(data)
}

dom中插入script標(biāo)簽

<!-- callback參數(shù)對(duì)象對(duì)應(yīng)上面callback函數(shù)名 -->
<script src="http://example.com/jsonp.js?callback=myfunc"></script>

瀏覽器請(qǐng)求//example.com/jsonp.js?callback=myfunc, 得到內(nèi)容

myfunc({"foo": "bar"}) //數(shù)據(jù)傳入到了callback函數(shù)

本質(zhì)上是通過(guò)script標(biāo)簽獲取數(shù)據(jù), script標(biāo)簽是只支持GET的。

總結(jié)

  • 目前來(lái)說(shuō)除盏,數(shù)據(jù)量小的跨域傳輸叉橱,jsonp是一種很好的解決方案。
  • jsonp在data中可以自動(dòng)識(shí)別者蠕,res.status窃祝,res.info等狀態(tài)位,比較方便踱侣。
  • php 端的接受代碼最好不要采用Access-Control-Allow-Origin:*風(fēng)險(xiǎn)太大粪小。
  • Jsonp的兼容性更好大磺,在更加古老的瀏覽器中都 可以運(yùn)行。
  • Jsonp只支持GET請(qǐng)求而不支持POST等其它類(lèi)型的HTTP請(qǐng)求
  • Jsonp只支持跨域HTTP請(qǐng)求這種情況探膊,不能解決不同域的兩個(gè)頁(yè)面之間如何進(jìn)行JavaScript調(diào)用的問(wèn)題杠愧。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市逞壁,隨后出現(xiàn)的幾起案子流济,更是在濱河造成了極大的恐慌,老刑警劉巖腌闯,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绳瘟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡绑嘹,警方通過(guò)查閱死者的電腦和手機(jī)稽荧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)工腋,“玉大人姨丈,你說(shuō)我怎么就攤上這事∩醚” “怎么了蟋恬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)趁冈。 經(jīng)常有香客問(wèn)我歼争,道長(zhǎng),這世上最難降的妖魔是什么渗勘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任沐绒,我火速辦了婚禮,結(jié)果婚禮上旺坠,老公的妹妹穿的比我還像新娘乔遮。我一直安慰自己,他們只是感情好取刃,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布蹋肮。 她就那樣靜靜地躺著,像睡著了一般璧疗。 火紅的嫁衣襯著肌膚如雪坯辩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天崩侠,我揣著相機(jī)與錄音漆魔,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛有送,可吹牛的內(nèi)容都是我干的淌喻。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼雀摘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼裸删!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起阵赠,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涯塔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后清蚀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匕荸,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年枷邪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榛搔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡东揣,死狀恐怖践惑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘶卧,我是刑警寧澤尔觉,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站芥吟,受9級(jí)特大地震影響侦铜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钟鸵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一钉稍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棺耍,春花似錦嫁盲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缸托。三九已至左敌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俐镐,已是汗流浹背矫限。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叼风。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓取董,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親无宿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茵汰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • JavaScript是一種在Web開(kāi)發(fā)中經(jīng)常使用的前端動(dòng)態(tài)腳本技術(shù)。在JavaScript中孽鸡,有一個(gè)很重要的...
    西瓜w閱讀 1,768評(píng)論 0 1
  • 什么是跨域 跨域蹂午,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的彬碱,是瀏覽器對(duì)JavaScript實(shí)...
    Yaoxue9閱讀 1,305評(píng)論 0 6
  • 什么是跨域 跨域豆胸,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的巷疼,是瀏覽器對(duì)JavaScript實(shí)...
    HeroXin閱讀 837評(píng)論 0 4
  • 什么是跨域 跨域晚胡,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的嚼沿,是瀏覽器對(duì)JavaScript實(shí)...
    他方l閱讀 1,066評(píng)論 0 2
  • 原文地址:原文地址 什么是跨域估盘? 跨域是指一個(gè)域下的文檔或腳本試圖去請(qǐng)求另一個(gè)域下的資源,這里跨域是廣義的伏尼。 廣義...
    C_Y大漁閱讀 1,259評(píng)論 1 13