總結(jié)兩種常見的前端跨域方案CORS與JSONP

一,目前主流的JSONP,這個(gè)名字的來源是jq的Ajax請(qǐng)求有現(xiàn)成的封裝好了的跨域方法,只需要在Ajax請(qǐng)求里設(shè)置一個(gè)dataType屬性等于jsonp即可:

$.ajax({??

????????type?:?"get",??

????????async:false,??

? ? ? ? url?:?"http://xxxx.com/index.html?sid=1494&busiId=101",

????????dataType?:?"jsonp",//數(shù)據(jù)類型為jsonp??

????????jsonp:?"jsonpCallback",//服務(wù)端用于接收callback調(diào)用的function名,實(shí)際可以不填??

????????success?:?function(data){

? ? ? ? ? ? 上面jsonp參數(shù)可以不填,因?yàn)閖q會(huì)把返回值放到success里設(shè)置此處的回調(diào),所以實(shí)際上像平常的ajax請(qǐng)求那樣寫即可

? ? ? ? },??

????????error:function(){? ? ?alert('fail');? ? ? ?}??

????});??

jsonp的原理實(shí)則很簡(jiǎn)單,相當(dāng)于利用了一個(gè)瀏覽器的漏洞,因?yàn)槠匠T贖TML里引入資源時(shí)無論是css、圖片、script都是可以不分站點(diǎn)的,也就是自帶了跨域,此時(shí)我們只需用js創(chuàng)建一個(gè)script標(biāo)簽,把src設(shè)置成服務(wù)器的地址,并把回調(diào)加在src(即http:xxxx.com/index.html?callback=xxxxx),此時(shí)服務(wù)器配合截取callback,然后返回此callback的參數(shù)調(diào)用(即返回一個(gè)可執(zhí)行的JS代碼),就實(shí)現(xiàn)了跨域并回調(diào)的效果。

此方式的好處是兼容性好,瀏覽器都支持,但安全性不夠高,且只不支持POST請(qǐng)求,即使發(fā)的是post請(qǐng)求,也會(huì)變?yōu)間et。


二、W3C推薦的CORS,此種方式是標(biāo)準(zhǔn)推薦的,是一個(gè)更好的方式,也是未來的方式,前端的實(shí)現(xiàn)方式很簡(jiǎn)單,只是在原生的http請(qǐng)求基礎(chǔ)上,在設(shè)置請(qǐng)求頭部信息時(shí),要多設(shè)置一個(gè)Origin屬性,把此屬性指向服務(wù)器允許的地址即可:

? ?var?xhr =?new?XMLHttpRequest();

????xhr.open("post",?"http://xxxxx.com/index.html",?true);

????xhr.setRequestHeader("Content-Type",?"application/x-www-form-urlencoded");

????// 聲明請(qǐng)求源

????xhr.setRequestHeader("Origin",?"http://example.com");

????xhr.onreadystatechange =?function?() {

????????if?(xhr.readyState == 4 && xhr.status == 200) {

????????????var?responseText = xhr.responseText;

????????????console.info(responseText);

????????}

????}

????xhr.send();

此方式的好處是安全且是標(biāo)準(zhǔn)推薦的,缺點(diǎn)是ie10以下的瀏覽器不支持,所以導(dǎo)致它尚未能成為主流方式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ajax作為前端開發(fā)必需的基礎(chǔ)能力之一,你可能會(huì)使用它,但并不一定懂得其原理,以及更深入的服務(wù)器通信相關(guān)的知識(shí)。在...
    蕭玄辭閱讀 885評(píng)論 0 0
  • 什么是跨域? 2.) 資源嵌入:、、、等dom標(biāo)簽,還有樣式中background:url()、@font-fac...
    電影里的夢(mèng)i閱讀 2,462評(píng)論 0 5
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對(duì)象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,546評(píng)論 0 7
  • 原文地址:原文地址 什么是跨域? 跨域是指一個(gè)域下的文檔或腳本試圖去請(qǐng)求另一個(gè)域下的資源,這里跨域是廣義的。 廣義...
    C_Y大漁閱讀 1,299評(píng)論 1 13
  • ??2005 年,Jesse James Garrett 發(fā)表了一篇在線文章,題為“Ajax: A new App...
    霜天曉閱讀 941評(píng)論 0 1

友情鏈接更多精彩內(nèi)容