昨天測試一個網(wǎng)頁聯(lián)調(diào)問題時發(fā)送請求總是發(fā)送不成功故觅,因為時IE8環(huán)境提示很有限桂肌,后來無奈開啟IE調(diào)試模式發(fā)現(xiàn)報錯信心時"no Transtport",結(jié)合實際環(huán)境想到原來時跨域問題造成的施禾。為此想總結(jié)一下Web跨域問題旗扑。
一张漂、跨域問題的由來
為了防止某些文檔或腳本加載別的域下的未知內(nèi)容造成泄露隱私肢预,破壞系統(tǒng)等安全行為,1995年微姊, Netscape 公司在瀏覽器中引入同源策略/SOP(Same origin policy)酸茴,它是瀏覽器最核心也最基本的安全功能,對Web訪問做了兩種限制:
1兢交、不能通過ajax的方法或其他腳本中的請求去訪問不同源中的文檔薪捍。
2、瀏覽器中不同域的框架之間是不能進(jìn)行js的交互操作的配喳。
引入SOP的初衷是為了Web安全飘诗,但實際使用中,正常合理的跨域請求也會遭到限制界逛,由此產(chǎn)生了跨域問題。
二纺座、怎么算跨域(同源的定義)
兩個URL的協(xié)議息拜,域名(主機名、IP)和端口都相同則認(rèn)為是同源,否則有任一個不同則認(rèn)為跨域少欺。
IE有例外:授信范圍(Trust Zones):兩個相互之間高度互信的域名喳瓣,如公司域名(corporate domains),不遵守同源策略的限制赞别。IE未將端口號加入到同源策略的組成部分之中畏陕,因此 http://company.com:81/index.html 和http://company.com/index.html 屬于同源并且不受任何限制。
三仿滔、常見跨域問題解決方
要解決瀏覽器跨域請求問題惠毁,必須要服務(wù)器端支持,如果服務(wù)器本身限制不允許跨域訪問崎页,則無法實現(xiàn)鞠绰。
1、JSONP
同源策略下飒焦,某個服務(wù)器是無法獲取到服務(wù)器以外的數(shù)據(jù),但是html里面的img,iframe和script等標(biāo)簽是個例外,這些標(biāo)簽可以通過src屬性請求到其他服務(wù)器上的數(shù)據(jù)眷柔。
JSONP就是通過script節(jié)點src調(diào)用跨域的請求糟趾。當(dāng)我們向服務(wù)器提交一個JSONP的請求時,我們給服務(wù)傳了一個特殊的參數(shù),告訴服務(wù)端要對結(jié)果特殊處理一下。這樣服務(wù)端返回的數(shù)據(jù)就會進(jìn)行一點包裝休雌,客戶端就可以處理灶壶。如下圖:
特點:JSONP跨域方式只需要服務(wù)端支持即可,簡單方便挑辆,但它只支持GET的方式提交例朱,不支持其他Post的提交,Get方式對請求的參數(shù)長度有限制鱼蝉,在有些情況下可能不滿足要求洒嗤。
2、CORS
CORS(跨域資源共享魁亦,Cross-Origin Resource Sharing)是通過客戶端+服務(wù)端協(xié)作聲明的方式來確保請求安全的渔隶。服務(wù)端會在HTTP請求頭中增加一系列HTTP請求參數(shù)(例如Access-Control-Allow-Origin等),來限制哪些域的請求和哪些請求類型可以接受洁奈,而客戶端在發(fā)起請求時必須聲明自己的源(Orgin)间唉,否則服務(wù)器將不予處理,如果客戶端不作聲明利术,請求甚至?xí)粸g覽器直接攔截都到不了服務(wù)端呈野。服務(wù)端收到HTTP請求后會進(jìn)行域的比較,只有同域的請求才會處理印叁,并在響應(yīng)頭中增加允許域信息被冒,瀏覽器檢查響應(yīng)頭中允許域是否正常军掂,若不正常就限制輸出。
特點:需要瀏覽器客戶端昨悼、服務(wù)端同時支持蝗锥,有兼容性問題(IE8就通過XDR只實現(xiàn)了CORS的部分規(guī)范,只支持GET/POST形式的請求率触。另外只支持 http 和 https )终议。瀏覽器支持情況如下圖:
注意,跨域請求始終是網(wǎng)頁安全中一個比較頭疼的問題葱蝗,CORS提供了一種跨域請求方案穴张,但沒有為安全訪問提供足夠的保障機制,如果你需要信息的絕對安全垒玲,不要依賴CORS當(dāng)中的權(quán)限制度陆馁,應(yīng)當(dāng)使用更多其它的措施來保障,比如OAuth2合愈。
3叮贩、其它不常用方式
WebSocket、ifream佛析、服務(wù)器代理益老、flash socket。