天天看點

CORS實作原理

跨域解決方案CORS

1.1 什麼是跨域

出于浏覽器的同源政策限制。同源政策(Sameoriginpolicy)是一種約定,它是浏覽器最核心也最基本的安全功能,如果缺少了同源政策,則浏覽器的正常功能可能都會受到影響。可以說Web是建構在同源政策基礎之上的,浏覽器隻是針對同源政策的一種實作。同源政策會阻止一個域的javascript腳本和另外一個域的内容進行互動。所謂同源(即指在同一個域)就是兩個頁面具有相同的協定(protocol),主機(host)和端口号(port)

如果跨域調用,會出現如下錯誤:

No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin

‘http://localhost:9100’ is therefore not allowed access. The response had HTTP status code 400.

由于我們采用的是前後端分離的程式設計方式,前端和後端必定存在跨域問題。解決跨域問題可以采用CORS

1.2 CORS簡介

CORS 是一個 W3C 标準,全稱是"跨域資源共享"(Cross-origin resource sharing)。CORS需要浏覽器和伺服器同時支援。目前,所有浏覽器都支援該功能,IE 浏覽器不能低于 IE10。它允許浏覽器向跨源伺服器,發出 XMLHttpRequest 請求,進而克服了 AJAX 隻能同源使用的限制。整個 CORS 通信過程,都是浏覽器自動完成,不需要使用者參與。對于開發者來說,CORS 通信與同源的 AJAX 通信沒有差别,代碼完全一樣。浏覽器一旦發現 AJAX 請求跨源,就會自動添加一些附加的頭資訊,有時還會多出一次附加的請求,但使用者不會有感覺。是以,實作 CORS 通信的關鍵是伺服器。隻要伺服器實作了 CORS 接口,就可以跨源通信。

請求過程如下圖:

CORS實作原理

Preflight Request:

CORS實作原理

然後伺服器端給我們傳回一個PreflightResponse

CORS實作原理

那麼具體如何實作呢?springMVC的版本在4.2或以上版本,可以使用注解實作跨域。 我們隻需要在Controller類上添加注解

@CrossOrigin

就可以了。

繼續閱讀