一、跨域問題的由來
為了防止某些文件或指令碼載入別的域下的未知內容造成洩露隱私,破壞系統等安全行為,2023年, netscape 公司在瀏覽器中引入同源策略/sop(same origin policy),它是瀏覽器最核心也最基本的安全功能,對web訪問做了兩種限制:
1、不能通過ajax的方法或其他指令碼中的請求去訪問不同源中的文件。
2、瀏覽器中不同域的框架之間是不能進行js的互動操作的。
引入sop的初衷是為了web安全,但實際使用中,正常合理的跨域請求也會遭到限制,由此產生了跨域問題。
二、怎麼算跨域(同源的定義)
兩個url的協議,網域名稱(主機名、ip)和埠都相同則認為是同源,否則有任乙個不同則認為跨域。
ie有例外:
授信範圍(trust zones):兩個相互之間高度互信的網域名稱,如公司網域名稱(corporate domains),不遵守同源策略的限制。
ie未將埠號加入到同源策略的組成部分之中,因此 和 屬於同源並且不受任何限制。
三、常見跨域問題解決方
要解決瀏覽器跨域請求問題,必須要伺服器端支援,如果伺服器本身限制不允許跨域訪問,則無法實現。
1、jsonp
同源策略下,某個伺服器是無法獲取到伺服器以外的資料,但是html裡面的img,iframe和script等標籤是個例外,這些標籤可以通過src屬性請求到其他伺服器上的資料。而jsonp就是通過script節點src呼叫跨域的請求。當我們向伺服器提交乙個jsonp的請求時,我們給服務傳了乙個特殊的引數,告訴服務端要對結果特殊處理一下。這樣服務端返回的資料就會進行一點包裝,客戶端就可以處理。
如jsonp請求:example domain,如果沒有後面的callback引數,即不使用jsonp的模式,該服務的返回結果可能是乙個單純的json字串,比如:。如果和服務端約定jsonp格式,那麼服務端就會處理callback的引數,將返回結果進行一下處理,比如處理成:mycallback()
特點:jsonp跨域方式只需要服務端支援即可,簡單方便,但它只支援get的方式提交,不支援其他post的提交,get方式對請求的引數長度有限制,在有些情況下可能不滿足要求。
2、cors
cors(跨域資源共享,cross-origin resource sharing)是通過客戶端+服務端協作宣告的方式來確保請求安全的。服務端會在http請求頭中增加一系列http請求引數(例如access-control-allow-origin等),來限制哪些域的請求和哪些請求型別可以接受,而客戶端在發起請求時必須宣告自己的源(orgin),否則伺服器將不予處理,如果客戶端不作宣告,請求甚至會被瀏覽器直接攔截都到不了服務端。服務端收到http請求後會進行域的比較,只有同域的請求才會處理,並在響應頭中增加允許域資訊,瀏覽器檢查響應頭中允許域是否正常,若不正常就限制輸出。
特點:需要瀏覽器客戶端、服務端同時支援,相容性問題,比如ie8就通過xdr只實現了cors的部分規範,只支援get/post形式的請求。另外只支援 http 和 https 。
3、其它一些不常用方式
websocket、ifream、伺服器**、flash socket。
解決跨域問題
什麼是跨域訪問 舉個栗子 在a 中,我們希望使用ajax來獲得b 中的特定內容。如果a 與b 不在同乙個域中,那麼就出現了跨域訪問問題。你可以理解為兩個網域名稱之間不能跨過網域名稱來傳送請求或者請求資料,否則就是不安全的。總而言之,同源策略規定,瀏覽器的ajax只能訪問跟它的html頁面同源 相同網...
解決跨域問題
雖然原理比較複雜,但是前面說過 事實上,springmvc已經幫我們寫好了cors的跨域過濾器 corsfilter 內部已經實現了剛才所講的判定邏輯,我們直接用就好了。在learn gateway中編寫乙個配置類,並且註冊corsfilter import org.springframework....
解決跨域問題
注意 1.如果是協議和埠造成的跨域問題,前端無法處理 2.是否跨域,僅僅通過url的首部來判斷,不會通過網域名稱對應的ip位址是否相同來判斷 3.跨域並不是請求發不出去,而是請求發出去了,也正常返回結果了,但是結果被瀏覽器攔截了。利用script標籤沒有跨域的限制,網頁可以從其他 動態的獲取json...