JSONP_跨域
什么是同源策略
瀏覽器出于安全方面的考慮,只允許與本域下的接口交互趴梢。不同源的客戶端腳本在沒有明確授權(quán)的情況下漠畜,不能讀寫對方的資源
由Netscape提出的一個(gè)著名的安全策略。現(xiàn)在所有支持JavaScript 的瀏覽器都會使用這個(gè)策略
本域名指的是:
- 同協(xié)議
如:都是http,https,file,ssh,mailto,tel協(xié)議
例:http://jirengu.com和 https://jirengu.com/a.js //兩個(gè)協(xié)議不同
- 同域名
在//后到第一個(gè)/之間的域名完全相同
例:http://jirengu.com/a 和 http://jirengu.com/b //同域名
http://jirengu.com 和 http://bbs.jirengu.com //不同域
- 同端口
如都是80端口
例:http://jirengu.com/a/b.js 和 http://jirengu.com/index.php
//同端口(沒寫端口的默認(rèn)端口為80)
http://jiengu.com 和 http://jirengu.com:8080/a.js
//不同端口(前一個(gè)端口為8080)
什么是跨域坞靶?跨域有幾種實(shí)現(xiàn)形式
什么是跨域
- 跨域就是突破同源策略的限制憔狞,使一個(gè)域名的網(wǎng)頁可以請求另一個(gè)域名的資源
實(shí)現(xiàn)方式
- 降域document.domain
前提條件:操作iframe,這兩個(gè)域名必須屬于同一個(gè)基礎(chǔ)域名!而且所用的協(xié)議,端口都要一致彰阴,否則無法利用document.domain進(jìn)行跨域同時(shí)為兩個(gè)域設(shè)置document.domain= xxx.com - jsonp
利用script的src標(biāo)簽的跨域?qū)傩择遥瑐鬟f一個(gè)callback參數(shù)給服務(wù)端來獲取其他源的數(shù)據(jù) - cors 跨域資源共享
在HTTP請求里添加特殊的頭,允許服務(wù)器指定特定的域名可以跨域訪問 - HTML5 postMssage
html5引入的API,可以實(shí)現(xiàn)跨文檔尿这、多窗口廉丽、跨域消息的傳遞
JSONP 的原理是什么
- 利用<script>標(biāo)簽沒有跨域限制來達(dá)到與第三方通訊的目的
- 當(dāng)需要通訊時(shí),本站腳本創(chuàng)建一個(gè)<script>元素妻味,地址指向第三方的API網(wǎng)址正压,形如: <script src="http://www.example.net/api?param1=1¶m2=2"></script> 并提供一個(gè)回調(diào)函數(shù)來接收數(shù)據(jù)(函數(shù)名可約定,或通過地址參數(shù)傳遞)
- 第三方產(chǎn)生的響應(yīng)為json數(shù)據(jù)的包裝(故稱之為jsonp责球,即json padding)焦履,形如: callback({"name":"hax","gender":"Male"}) 這樣瀏覽器會調(diào)用callback函數(shù),并傳遞解析后json對象作為參數(shù)雏逾。本站腳本可在callback函數(shù)里處理所傳入的數(shù)據(jù)
CORS是什么
- CORS是一個(gè)W3C標(biāo)準(zhǔn)嘉裤,全稱是"跨域資源共享"(Cross-origin resource sharing),避開了瀏覽器的同源策略栖博,通過在http請求里添加特殊的頭屑宠,允許服務(wù)器指定哪些跨域請求是允許的
- 與jsonp使用目的相同,但是要比jsonp更強(qiáng)大仇让,缺點(diǎn)是不兼容老的IE瀏覽器典奉。如:
header("Access-Control-Allow-Origin:http://jiuyi.com")
//指定[http://jiuyi.com](http://jiuyi.com) 這個(gè)域可以請求它躺翻;
header("Access-Control-Allow-Origin:*")
//指定所有域都可以請求它;