跨域的幾種方式:
cors方式
cross-orign-resource-shareing(跨域)
參考:http://www.ruanyifeng.com/blog/2016/04/cors.html
分為簡單請(qǐng)求和非簡單請(qǐng)求。
非簡單請(qǐng)求會(huì)發(fā)送preflight(預(yù)請(qǐng)求)
cors跨域方式是瀏覽器自己帶的。
主要控制方式是在服務(wù)器端,同時(shí)需要瀏覽器的部分配合。
瀏覽器端主要的方法:
Access-Control-Request-Origin(Origin)
Access-Control-Request-Method
Access-Control-Request-Headers
帶憑據(jù)的請(qǐng)求
withCreditials:
服務(wù)器主要的方法:
Access-Control-Allow-Origin:
Access-Control-Allow-Methods:
Access-Control-Alllow-Headers:
Access-Control-Max-Age:
帶憑據(jù)的請(qǐng)求
Access-Control-Allow-Creditials:
JSONP
參考:https://segmentfault.com/a/1190000015597029
后臺(tái)服務(wù)相當(dāng)于中轉(zhuǎn)站,在前端的一個(gè)script標(biāo)簽里創(chuàng)建另一個(gè)script標(biāo)簽,并指定新的script標(biāo)簽的src,把方法和參數(shù)都從url中傳給后臺(tái)。
后臺(tái)得到url中的參數(shù)(包括方法和方法參數(shù)),返回到前端,作為新的script的內(nèi)容執(zhí)行帶參函數(shù)。
缺陷:
1.只能用get方法;
2.不安全:從其它域中引用代碼,一定要保證安全,一旦出現(xiàn)安全問題,幾乎要放棄使用;
3.不能判斷jsonp是否請(qǐng)求失敗。script標(biāo)簽的onerror事件瀏覽器支持性不是很好。
iframe跨域
1. 空iframe+form表單 v
2. iframe + document.domain v
3. iframe + window.name v
4. iframe + location.hash
5. iframe + postMessage v
nginx
知識(shí)補(bǔ)充
和跨域相關(guān)的一個(gè)設(shè)計(jì)模式是代理模式
概念:由于一個(gè)對(duì)象不能直接訪問另一個(gè)變量,所以要通過一個(gè)中間變量去訪問另一個(gè)變量。
JSONP代理模式:被代理者是要請(qǐng)求的html,請(qǐng)求的url返回?cái)?shù)據(jù)的那個(gè)域?qū)儆诖碛?,代理域和被代理域在同一個(gè)域名下,代理域指的是動(dòng)態(tài)的script標(biāo)簽。請(qǐng)求的url是另一個(gè)域。
xxx + iframe 跨域: 被代理者是要請(qǐng)求的html,請(qǐng)求的url返回的那個(gè)域?qū)儆诖碛?,代理域和被代理域在同一個(gè)域名下,代理域指的是iframe。請(qǐng)求的url是另一個(gè)域。(window.name,iframe + form表單,window.postMessage,document.domain,location.hash)