跨域問題是我們非常常見的問題,尤其在跨系統頁面間的呼叫經常會遇到,解決的方式在網上一搜一大把,這裡整理出我遇到跨域問題解決的方式以及思路,如何安全的解決跨域呼叫請繼續往下看。
什麼是cross-origin_resource_sharing? 跨域請求存在的原因:由於瀏覽器的同源策略,即屬於不同域的頁面之間不能相互訪問各自的頁面內容。
網域名稱不同
二級網域名稱相同,子網域名稱不同
埠不同,協議不同
jsonp
cors(w3c標準,跨域資源共享 - cross-origin resource sharing)
websocke
**服務(nginx)
ps. 我們這裡只介紹:cors處理方式。
首先讓我們看一下前端報出的跨域錯誤資訊
第一種:no 'access-control-allow-origin' header is present on the requested resource
,並且the response had http status code 404
ps.並且the response had http status code 404
問題原因:伺服器端後台沒有允許options請求
第二種:no 'access-control-allow-origin' header is present on the requested resource
,並且the response had http status code 405
ps.並且the response had http status code 405
問題原因:伺服器端後台允許了options請求,但是某些安全配置阻止了options請求
第三種:no 'access-control-allow-origin' header is present on the requested resource
,並且the response had http status code 200
ps.並且the response had http status code 200
問題原因:伺服器端後台允許了options請求,並且options請求沒有被阻止,但是頭部不匹配。
第四種:heade contains multiple values '*,*'
,並且the response had http status code 200
ps.並且the response had http status code 200
問題原因:設定多次access-control-allow-origin=*,可能是配置的人對cors實現原理和機制不了解導致。
有時你會發現明明請求的是post、get、put、delete,但是瀏覽器中看到的確實option,,為什麼會變成option?
原因:因為本次ajax請求是「非簡單請求」,所以請求前會傳送一次預檢請求(options),這個操作由瀏覽器自己進行。如果伺服器端後台介面沒有允許options請求,將會導致無法找到對應介面位址,因此需要服務端提供相應的資訊到response header中,繼續往下看。
# 服務端允許訪問的網域名稱
access-control-allow-origin=
# 服務端允許訪問http method
access-control-allow-methods=get, post, put, delete, patch, options
# 服務端接受跨域帶過來的cookie,當為true時,origin必須是明確的網域名稱不能使用*
access-control-allow-credentials=true
# access-control-allow-headers 表明它允許跨域請求包含content-type頭,我們這裡不設定,有需要的可以設定
#access-control-allow-headers=content-type,accept
# 跨域請求中預檢請求(http method為option)的有效期,20天,單位秒
access-control-max-age=1728000
ps. 如果跨域需要攜帶cookie去請求,access-control-allow-credentials
必須為true,但是需要注意當access-control-allow-credentials=true
時,access-control-allow-origin
就不能為」 * 「 ,必須是明確的網域名稱,當然可以多個網域名稱使用 「,」 分割
如果是瀏覽器直接訪問跨域請求url,只要服務端返回 「access-control-allow-x」 系列header在response中即可成功訪問。
如果是ajax發起的請求該如何處理?
第一種:請求不需要攜帶cookie
$.ajax(else
},error:function (data)
});
ps. 增加crossdomain=true
第二種:請求需要攜帶cookie
$.ajax(,
crossdomain: true,
success: function (data) else
},error:function (data)
});
ps. 增加crossdomain與xhr.withcredentials,傳送ajax時,request header中便會帶上 cookie 資訊。
到這裡你以為跨域的相關都介紹完畢了?太天真
最後還有乙個終極boss問題,是什麼問題呢?
上面的第二種攜帶cookie的跨域請求呼叫方式在ios下可以正常工作,但是在android下無法正常工作並且還報錯,額。。。。。
問題原因:因為android下的webview不相容這個寫法,使用標準的 beforesend(xhr) 替換
xhrfields:
ps. webview不相容的寫法,firefox下也不相容
標準的寫法:
$.ajax(
crossdomain:true,
success: function (data) else
},error:function (data)
});
到這跨域的相關使用就介紹完畢,這次是真的結束了。keep real!
**:
ajax跨域方法之CORS跨域總結
php端新增 header access control allow origin header access control allow headers content type header access control allow methods post nodejs 配置全站路由都允許跨域...
ajax跨域 ajax跨域學習總結(一)
網域名稱又稱網域 網域名稱,是由一串用點分隔的名字組成的internet上某一台計算機或計算機組的名稱,用於在資料傳輸時標識計算機的電子方位 有時也指地理位置 internet的核心服務dns domain name system,網域名稱系統,有時也簡稱為網域名稱 提供網域名稱到ip位址的相對映。...
js 跨域總結
1.window.domain 強制設定相關頁面 window.domain相同 a.html document.domain a.com b.html document.domain a.com 2.window.name 同一視窗,動態改變鏈結 window.name 是不變的,最多保留2m資料...