跨域踩坑經驗總結(內涵 跨域知識科普)

2022-02-12 18:05:24 字數 4307 閱讀 1022

跨域問題是我們非常常見的問題,尤其在跨系統頁面間的呼叫經常會遇到,解決的方式在網上一搜一大把,這裡整理出我遇到跨域問題解決的方式以及思路,如何安全的解決跨域呼叫請繼續往下看。

什麼是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資料...