JSONP_跨域

1: 什么是同源策略

同源策略(Same origin policy)是一種約定,是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響慕的。

現(xiàn)在所有支持JavaScript 的瀏覽器都會使用這個策略。
所謂同源是指挤渔,域名肮街,協(xié)議端口相同判导。
當一個瀏覽器的兩個tab頁中分別打開來** 百度谷歌**的頁面
當瀏覽器的百度tab頁執(zhí)行一個腳本的時候會檢查這個腳本是屬于哪個頁面的嫉父,
即檢查是否同源,只有和百度同源的腳本才會被執(zhí)行骡楼。
如果非同源熔号,那么在請求數(shù)據(jù)時,瀏覽器會在控制臺中報一個異常鸟整,提示拒絕訪問引镊。

2: 什么是跨域?跨域有幾種實現(xiàn)形式

跨域:簡單來說就是不同域名之間相互訪問(<em>跨域并非瀏覽器限制了發(fā)起跨站請求篮条,而是跨站請求可以正常發(fā)起弟头,但返回結(jié)果被瀏覽器攔截了</em>)
限制跨域是瀏覽器的行為,不是JS的行為
幾種實現(xiàn)形式

  • JSONP(JSON with Padding 填充式JSON 或參數(shù)式JSON)
  • CORS(Cross-Origin Resource Sharing涉茧,跨源資源共享)
  • HTML5的window.postMessage
    window.postMessage(message,targetOrigin) 方法是html5新引進的特性赴恨,可以使用它來向其它的window對象發(fā)送消息,無論這個window對象是屬于同源或不同源伴栓,目前IE8+伦连、FireFox雨饺、Chrome、Opera等瀏覽器都已經(jīng)支持window.postMessage方法惑淳。
    window.postMessage允許兩個窗口/幀之間跨域發(fā)送數(shù)據(jù)消息额港。從本質(zhì)上講,window.postMessage是一個跨域的無服務(wù)器墊片的Ajax歧焦。
  • 降域
3: JSONP 的原理是什么

在js中移斩,我們雖然不能直接用XMLHttpRequest請求不同域上的數(shù)據(jù),但是在頁面上引入不同域上的js腳本文件卻是可以的绢馍,jsonp正是利用這個特性來實現(xiàn)的向瓷。例如:

<script type="text/javascript">
    function dosomething(jsondata){
        //處理獲得的json數(shù)據(jù)
    }
</script>
<script src="http://example.com/data.php?callback=dosomething"></script>

js文件載入成功后會執(zhí)行我們在url參數(shù)中指定的函數(shù),并且會把我們需要的json數(shù)據(jù)作為參數(shù)傳入舰涌。所以jsonp是需要服務(wù)器端的頁面進行相應(yīng)的配合的猖任。
JSONP實際上就是被包含在一個回調(diào)函數(shù)中的JSON。由兩部分組成:回調(diào)函數(shù)和數(shù)據(jù)舵稠〕回調(diào)函數(shù)是當響應(yīng)到來時應(yīng)該在頁面中調(diào)用的函數(shù)入宦,而數(shù)據(jù)就是傳入回調(diào)函數(shù)中的JSON數(shù)據(jù)哺徊。
JSONP的優(yōu)點是:

  • 它不像XMLHttpRequest對象實現(xiàn)的Ajax請求那樣受到同源策略的限制;
  • 它的兼容性更好乾闰,在老版本的瀏覽器中可以運行落追,不需要XMLHttpRequest或ActiveX的支持;
  • 它在請求完畢后可以通過調(diào)用callback的方式回傳結(jié)果涯肩,方便調(diào)用轿钠。
    JSONP的缺點則是:
  • 它只支持GET請求而不支持POST等其它類型的HTTP請求,不能提交大量數(shù)據(jù)病苗;
  • 它只支持跨域HTTP請求這種情況疗垛,不能解決不同域的兩個頁面之間如何進行JavaScript調(diào)用的問題。
4: CORS是什么硫朦?

1.CORS(Cross-Origin Resource Sharing贷腕,跨源資源共享)是W3C 的一個工作草案,定義了在必須訪問跨源資源時咬展,瀏覽器與服務(wù)器應(yīng)該如何溝通泽裳。CORS 背后的基本思想,就是使用自定義的HTTP 頭部讓瀏覽器與服務(wù)器進行溝通破婆,從而決定請求或響應(yīng)是應(yīng)該成功涮总,還是應(yīng)該失敗。
2.實現(xiàn)此功能非常簡單祷舀,只需由服務(wù)器發(fā)送一個響應(yīng)標頭即可瀑梗。

瀏覽器支持情況:

  • IE 8+
  • Firefox 3.5+
  • Opera 12+
  • Safari 4+
  • Chrome 3+

假設(shè)我們頁面或者應(yīng)用已在 http://www.a.com/ 上了烹笔,而我們打算從 http://www.b.com 請求提取數(shù)據(jù)。一般情況下抛丽,如果我們直接使用 AJAX 來請求將會失敗箕宙,瀏覽器也會返回錯誤。利用 CORS铺纽,http://www.b.com 只需添加一個標頭柬帕,就可以允許來自 http://www.a.com 的請求。下面是用php進行的設(shè)置:

//服務(wù)器需要聲明這么一條響應(yīng)頭狡门,即可輕松跨域
//PHP中的 header() 設(shè)置陷寝,“*”號表示允許任何域向我們的服務(wù)端提交請求:
header("Access-Control-Allow-Origin: *")
//也可以設(shè)置指定的域名,如域名 http://h5.jd.com 其馏,那么就允許來自這個域名的請求:
header("Access-Control-Allow-Origin: http://example.com")

CORS和JSONP對比:
CORS與JSONP相比凤跑,更為先進、方便和可靠叛复。
1仔引、 JSONP只能實現(xiàn)GET請求,而CORS支持所有類型的HTTP請求褐奥。
2咖耘、 使用CORS,開發(fā)者可以使用普通的XMLHttpRequest發(fā)起請求和獲得數(shù)據(jù)撬码,比起JSONP有更好的錯誤處理儿倒。
3、 JSONP主要被老的瀏覽器支持呜笑,它們往往不支持CORS夫否,而絕大多數(shù)現(xiàn)代瀏覽器都已經(jīng)支持了CORS)。

5: 根據(jù)視頻里的講解演示三種以上跨域的解決方式

josnp

function addScriptTag(src) {  
  var script = document.createElement('script');    
  script.src = src;  
  document.body.appendChild(script);  
}  
  
window.onload = function () {  
  addScriptTag('http://example.com/ip?callback=foo');  
}  
  
function foo(data) {  
  console.log('Your public IP address is: ' + data.ip);  
};  
//
foo({  
  "ip": "8.8.8.8"  
}); 

降域

//在頁面 http://www.example.com/a.html 中設(shè)置document.domain:
<iframe src="example.com/b.html" id="iframe" onload="test()"></iframe>
    <script>
        document.domain='example.com';//設(shè)置成主域
        function test(){
            alert(document.getElementById('iframe').contentWindow);
        }
    </script>
//在頁面 http://example.com/b.html中也設(shè)置document.domain
<script>
        document.domain='example.com';//在iframe載入的這個頁面也設(shè)置 document.domain與主頁面相同
</script>
//而且是必須的叫胁,雖然這個文檔的domain就是example.com,但是還是必須顯示的設(shè)置document.domain的值

跨域資源共享(CORS)

這種方式只要服務(wù)端把response的header頭中設(shè)置Access-Control-Allow-Origin為制定可請求當前域名下數(shù)據(jù)的域名即可

//相關(guān)Ajax代碼可能如下
var xhr = new XMLHttpRequest();    
xhr.open("GET", "'http://www.baidu.com'", true);   
//區(qū)別就在于相對路徑換成了其他域的絕對路徑凰慈,也就是你要跨域訪問的接口地址。
xhr.send();    

//服務(wù)器端
res.header('Access-Control-Allow-Origin','*');//“*”號表示允許任何域向我們的服務(wù)端提交請求
res.header('Access-Control-Allow-Origin','http://www.baidu.com')//也可以設(shè)置指定的域名

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驼鹅,一起剝皮案震驚了整個濱河市微谓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谤民,老刑警劉巖堰酿,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異张足,居然都是意外死亡触创,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門为牍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哼绑,“玉大人岩馍,你說我怎么就攤上這事《逗” “怎么了蛀恩?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茂浮。 經(jīng)常有香客問我双谆,道長,這世上最難降的妖魔是什么席揽? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任顽馋,我火速辦了婚禮,結(jié)果婚禮上幌羞,老公的妹妹穿的比我還像新娘寸谜。我一直安慰自己,他們只是感情好属桦,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布熊痴。 她就那樣靜靜地躺著,像睡著了一般聂宾。 火紅的嫁衣襯著肌膚如雪果善。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天亏吝,我揣著相機與錄音岭埠,去河邊找鬼。 笑死蔚鸥,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的许赃。 我是一名探鬼主播止喷,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼混聊!你這毒婦竟也來了弹谁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤句喜,失蹤者是張志新(化名)和其女友劉穎预愤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咳胃,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡植康,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了展懈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片销睁。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡供璧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冻记,到底是詐尸還是另有隱情睡毒,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布冗栗,位于F島的核電站演顾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隅居。R本人自食惡果不足惜偶房,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望军浆。 院中可真熱鬧棕洋,春花似錦、人聲如沸乒融。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赞季。三九已至愧捕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間申钩,已是汗流浹背次绘。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撒遣,地道東北人邮偎。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像义黎,于是被迫代替她去往敵國和親禾进。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 什么是同源策略 同源政策(same-origin policy)是指同域名(或ip),同端口廉涕,同協(xié)議視為同一個域泻云,...
    小囧兔閱讀 493評論 0 1
  • 1.什么是同源策略瀏覽器出于安全方面的考慮,只允許與本域下的接口交互狐蜕。不同源的客戶端腳本在沒有明確授權(quán)的情況下宠纯,不...
    24_Magic閱讀 491評論 0 0
  • 1: 什么是同源策略 最初,它的含義是指层释,A網(wǎng)頁設(shè)置的 Cookie婆瓜,B網(wǎng)頁不能打開,除非這兩個網(wǎng)頁"同源",所謂...
    好奇而已閱讀 294評論 0 0
  • 題目1: 什么是同源策略 瀏覽器出于安全考慮湃累,只允許與本域下的接口交互勃救。不同源的客戶端腳本在沒有明確授權(quán)的情況下碍讨,...
    saintkl閱讀 234評論 0 0
  • 題目1: 什么是同源策略 所謂"同源"指的是"三個相同"。協(xié)議相同蒙秒、域名相同勃黍、端口相同。同源政策的目的晕讲,是為了保證...
    漂于行閱讀 403評論 0 0