跨域原理及解決而思路

產生跨域問題的3個原因:

1.瀏覽器的限制(後端服務器沒有限制)

2.發出的請求不是本域的(協議,域名,端口任何一個不同都是跨域)

3.發出的是XHR(XMLHttpRequest)請求

例如用<img src="xxxxurl" />的方式訪問一個不同域的地址不會出錯,因爲不是XHR請求

 

針對上面的3個原因有以下解決方案:

針對1的解決方案:對瀏覽器指定參數,讓瀏覽器不進行校驗就可以了。但這種方法需要每個用戶修改瀏覽器配置,一般不用

針對2的解決方案:方法1:被調用方修改配置,允許跨域。方法2:調用方修改配置,隱藏跨域。

針對3的解決方案:例如使用img的src或jsonp

 

jsonp:是一個json的補充使用方式,使用script標籤請求資源實現跨域。是一種變通的跨域方案

jsonp跨域使用的是動態的script標籤,返回的是js代碼。例如服務器返回的js代碼:exit($callback."($json)");

 

解決跨域問題:

方法1:被調用方解決(在響應頭自增字段,告訴瀏覽器允許跨域訪問)

跨域請求的頭部信息裏面有一個Origin字段值爲當前域名信息,當請求結束後瀏覽器會在響應頭查找被訪問服務器是否允許跨域的字段信息,如果沒有就報錯。該字段是Access-Control-Allow-Methods,Access-Control-Allow-Origin,Access-Control-Headers等。一般的簡單請求訪問設置Access-Control-Allow-Methods,Access-Control-Allow-Origin即可。但有些非一般的請求(發送真真數據前先發一個預檢測命令,驗證通過後再發真正的數據),在發送數據前要先發送預檢命令,如果通過後才能繼續正常把數據發送給被訪問服務器,需要在被訪問服務器設置Access-Control-Headers,還可以通過設置Access-Control-Max-Age設置預檢命令的有效期。

當Access-Control-Allow-Origin設置爲*的時候不支持帶cookie(被調用方的cookie)的跨域請求。需要設置爲調用服務器的地址。

如果有特殊要求,還可以實現帶自定義頭信息的跨域訪問

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章