運用cors解決跨域問題總結

2021-09-23 19:35:52 字數 1767 閱讀 9163

最近在做的乙個應用遷移專案,第一階段要將工作台頁面內的a應用所有鏈結,遷到b應用中,對應鏈結的網域名稱也變為b應用的網域名稱,因此產生了跨域問題。通常這種跨域問題可以採用jsonp請求解決,但是jsonp在本專案中會有幾個難點:一是前端改動較大,二是jsonp只支援get請求,另外就是比較難執行灰度(jsonp和非jsonp的請求顯然是不好作為灰度的a/b項的)。

除了jsonp,還有一種比較新的技術就是cors了。cors是一種允許當前域(domain)的資源(比如html/js/web service)被其他域(domain)的指令碼請求訪問的機制。使用cors,可以通過普通的xmlhttprequest發起請求和獲得資料,並且支援各種型別請求。缺點就是因為屬於比較新的技術,所以瀏覽器相容性有一定侷限。

由於這次改造的工作台只支援火狐和谷歌瀏覽器,所以cors的相容性也就不是問題。如果是其他pc端的系統,在選擇cors是就要考慮相容性的影響了。

下面就是具體怎麼實現cors。首先,對於支援cors的瀏覽器,傳送請求時,如果我們觀察請求頭會發現帶有"

origin:" ,該標識用來說明本次請求來自的域。要實現cors,只要在服務端在響應頭部加上標識「

access-control-allow-origin:」,這樣瀏覽器發現access-control-allow-origin和請求來自的域一致,就允許跨域訪問資源example.taobao.com的資源了。對應服務端**:

rundata.getresponse().setheader("access-control-allow-origin", "");             

如果access-control-allow-origin設定為"*",那麼任何域的請求都可以通過cors訪問服務資源,但是這樣顯然不夠安全。我們可以在服務端設定乙個域白名單,收到請求時先取請求頭中origin標識的域,判斷域是否在白名單中,如果在的話,再將該域設定到響應的access-control-allow-origin中。這樣就實現指定某些域cors請求服務資源。

服務端返回的響應除了加允許的請求域標識,同時對允許的請求方法也要標識,我們一般固定寫為get和post就可以:  rundata.getresponse().setheader("access-control-allow-methods","get,post");

同時需要設定:

rundata.getresponse().setheader("access-control-allow-headers", rundata.getrequest().getheader("access-control-request-headers"));//意思是請求的headers是什麼我就返回允許的headers什麼

需要注意的時,按照上面方法做,此時的cors請求可以訪問服務,但是請求不會帶cookie資訊。如果需要cookie資訊的話,需要請求js和服務端做乙個通訊驗證:

js請求: var invocation = new xmlhttprequest();  invocation.withcredentials = true;        

服務端:rundata.getresponse().setheader("access-control-allow-credentials", "true");      

該驗證ie並不支援,即使是高版本支援cors的ie10,11,所以這也是個坑。需要相容ie的應用基本不用考慮cors了。

最後,需要說的是

cors的

cors解決跨域問題

cors是乙個w3c標準,全稱是 跨域資源共享 cross origin resource sharing 它允許瀏覽器向跨源伺服器,發出xmlhttprequest請求,從而克服了ajax只能同源使用的限制。cors需要瀏覽器和伺服器同時支援。目前,所有瀏覽器都支援該功能,ie瀏覽器不能低於ie1...

CORS解決跨域問題

在前後端分離的背景下,我想大部分人都有過跨域問題,那我們先來了解一下什麼是跨域問題。當乙個資源從與該資源本身所在的伺服器不同的域 協議或埠請求乙個資源時,資源會發起乙個跨域http請求。例子 當遊覽器從a網域名稱的網頁,去請求b網域名稱的資源時,網域名稱 埠 協議任一不同,都是跨域。ajax suc...

跨域解決CORS

1.js跨域 js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向乙個不同的域請求資料,或者通過js獲取頁面中不同域的框架中 iframe 的資料。只要協議 網域名稱 埠有任何乙個不同,都被當作是不同的域。localhost 9000中的ajax 向localhost 9001中的...