跨域post请求实现方案小结--转
生活随笔
收集整理的這篇文章主要介紹了
跨域post请求实现方案小结--转
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【名詞解釋】 跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript 同源策略(注意Network Access這一節(jié)):http://www.w3.org/Security/wiki/Same_Origin_Policy 【問題描述】 瀏覽器出于安全的考量(避免惡意網(wǎng)站輕易讀取其他網(wǎng)站顯示的內(nèi)容,因為該內(nèi)容可能含有敏感信息,想象iframe嵌套銀行網(wǎng)頁)原則上允許跨域?qū)懚拗屏丝缬蜃x。寫是指數(shù)據(jù)的上行/發(fā)送(sending request),讀是指數(shù)據(jù)的下行/接收(receiving response)。(然而跨域?qū)懸彩呛懿话踩?#xff0c;容易導致CSRF/clickjacking攻擊。瀏覽器已經(jīng)限制了跨域讀,再限制跨域?qū)懙脑?#xff0c;那互聯(lián)網(wǎng)的每個頁面都成了孤島。避免非法跨域?qū)懶枰玫絫oken,本文不做討論。) 考慮下述情況: 指向外部域名的link和通過表單的向外部域發(fā)起get請求是一樣的,也都是允許的,點擊那一刻起,瀏覽器的當前域名轉(zhuǎn)向了目標網(wǎng)站,也就完全是域內(nèi)寫、讀了。 通過表單向外部域發(fā)起post請求也是允許的,理由同上,源網(wǎng)站無法讀取目標網(wǎng)站的任何內(nèi)容。 AJAX(借助XMLHttpRequest對象)跨域get/post是禁止的,因為使用AJAX就是為了讀取響應的內(nèi)容,這觸碰了跨域讀的限制。 JSONP屬于跨域讀,且形式限制為get請求,因為它利用了script標簽的特性(瀏覽器認為跨域讀腳本是例外,類似的還有img、iframe等等,注意它們共有的src屬性)。 因此對于瀏覽器而言:1和2沒有跨域;3遵循了限制跨域讀的原則;4屬于允許的例外。
雖然JSONP很好用,但它注定是get請求,get請求有語義要求(冪等)、長度限制(為了兼容限制255字節(jié))、安全隱患(容易受到csrf攻擊,csrf的解決必須是post請求配合token使用)。 那么,如何實現(xiàn)跨域post請求呢? 【解決方案】 1、CORS 概述:Cross-Origin Resource Sharing,W3C制定的跨站資源分享標準。post前會產(chǎn)生一次options嗅探(稱之為preflight,但簡單請求不會出現(xiàn))來確認有否跨域請求的權(quán)限;客戶端post時會帶上Origin頭指示來源網(wǎng)站,服務(wù)端響應時需帶上Access-Control-Allow-Origin頭與Origin頭的值匹配,以示許可。ie8提供了封裝好的XDomainRequest對象,部分實現(xiàn)了該標準;而其它瀏覽器則提供了XMLHttpRequest(Level 2)對象。 要求:ie8(XDomainRequest)/ie10/safari4/GC/FF3.5 參考:cross-site xmlhttprequest with CORS
參考:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS? 參考(中文):http://www.zfkun.com/394.html (simple reuest的定義描述不完整) 優(yōu)點:W3C標準方案 缺點:不兼容老瀏覽器,移動瀏覽器尚未支持。???桌面和移動瀏覽器兼容性 注意:若在多個iframe之間跨域通信,優(yōu)先考慮?window.postMessage 2、invisible iframe 概述:通過js動態(tài)生成不可見表單和iframe,將表單的target設(shè)為iframe的name以此通過iframe做post提交。提交后由于跨域,無法直接讀取響應內(nèi)容。一般的做法是,iframe內(nèi)通過js改變自身location的fragment,外部則監(jiān)聽iframe的onload事件,讀取fragment的內(nèi)容。有現(xiàn)成的跨域iframe通信類庫,如jQuery PostMessage Plugin。 要求:ie6/safari/GC/FF4 參考:http://stackoverflow.com/questions/298745/how-do-i-send-a-cross-domain-post-request-via-javascript#answer-6169703 參考:http://softwareas.com/cross-domain-communication-with-iframes 參考:http://thomas.bindzus.me/2007/12/24/adding-dynamic-contents-to-iframes/ 優(yōu)點:兼容性佳,facebook,google,新浪已/曾采用 缺點:依賴hack實現(xiàn),響應數(shù)據(jù)量大時需要切片、多次設(shè)置fragment并輪詢,響應頻繁時可能失效。 3、server proxy? 概述:當前域?qū)崿F(xiàn)一個代理,所有向外部域名發(fā)送的請求都徑由該代理中轉(zhuǎn)。 缺點:每個使用方都需要部署代理,數(shù)據(jù)中轉(zhuǎn)低效,對js有侵入。 4、flash proxy 概述:利用不可見的swf跨域post提交數(shù)據(jù),需要部署crossdomain.xml。例如alirte會自動檢測,若用戶安裝了flash,則以此實現(xiàn)跨域通信。 要求:flash9 參考:http://flxhr.flensed.com/ 優(yōu)點:ADOBE標準方案,相對CORS兼容性佳,相對invisible iframe響應數(shù)據(jù)量較大時優(yōu)勢明顯。 缺點:依賴flash。 原文:http://blog.csdn.net/doraeimo/article/details/7329779
雖然JSONP很好用,但它注定是get請求,get請求有語義要求(冪等)、長度限制(為了兼容限制255字節(jié))、安全隱患(容易受到csrf攻擊,csrf的解決必須是post請求配合token使用)。 那么,如何實現(xiàn)跨域post請求呢? 【解決方案】 1、CORS 概述:Cross-Origin Resource Sharing,W3C制定的跨站資源分享標準。post前會產(chǎn)生一次options嗅探(稱之為preflight,但簡單請求不會出現(xiàn))來確認有否跨域請求的權(quán)限;客戶端post時會帶上Origin頭指示來源網(wǎng)站,服務(wù)端響應時需帶上Access-Control-Allow-Origin頭與Origin頭的值匹配,以示許可。ie8提供了封裝好的XDomainRequest對象,部分實現(xiàn)了該標準;而其它瀏覽器則提供了XMLHttpRequest(Level 2)對象。 要求:ie8(XDomainRequest)/ie10/safari4/GC/FF3.5 參考:cross-site xmlhttprequest with CORS
參考:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS? 參考(中文):http://www.zfkun.com/394.html (simple reuest的定義描述不完整) 優(yōu)點:W3C標準方案 缺點:不兼容老瀏覽器,移動瀏覽器尚未支持。???桌面和移動瀏覽器兼容性 注意:若在多個iframe之間跨域通信,優(yōu)先考慮?window.postMessage 2、invisible iframe 概述:通過js動態(tài)生成不可見表單和iframe,將表單的target設(shè)為iframe的name以此通過iframe做post提交。提交后由于跨域,無法直接讀取響應內(nèi)容。一般的做法是,iframe內(nèi)通過js改變自身location的fragment,外部則監(jiān)聽iframe的onload事件,讀取fragment的內(nèi)容。有現(xiàn)成的跨域iframe通信類庫,如jQuery PostMessage Plugin。 要求:ie6/safari/GC/FF4 參考:http://stackoverflow.com/questions/298745/how-do-i-send-a-cross-domain-post-request-via-javascript#answer-6169703 參考:http://softwareas.com/cross-domain-communication-with-iframes 參考:http://thomas.bindzus.me/2007/12/24/adding-dynamic-contents-to-iframes/ 優(yōu)點:兼容性佳,facebook,google,新浪已/曾采用 缺點:依賴hack實現(xiàn),響應數(shù)據(jù)量大時需要切片、多次設(shè)置fragment并輪詢,響應頻繁時可能失效。 3、server proxy? 概述:當前域?qū)崿F(xiàn)一個代理,所有向外部域名發(fā)送的請求都徑由該代理中轉(zhuǎn)。 缺點:每個使用方都需要部署代理,數(shù)據(jù)中轉(zhuǎn)低效,對js有侵入。 4、flash proxy 概述:利用不可見的swf跨域post提交數(shù)據(jù),需要部署crossdomain.xml。例如alirte會自動檢測,若用戶安裝了flash,則以此實現(xiàn)跨域通信。 要求:flash9 參考:http://flxhr.flensed.com/ 優(yōu)點:ADOBE標準方案,相對CORS兼容性佳,相對invisible iframe響應數(shù)據(jù)量較大時優(yōu)勢明顯。 缺點:依賴flash。 原文:http://blog.csdn.net/doraeimo/article/details/7329779
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3977627.html
總結(jié)
以上是生活随笔為你收集整理的跨域post请求实现方案小结--转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 子查询in和表连接效率
- 下一篇: rsync+inotify实现服务器之间