爲什麼會跨域,要先了解瀏覽器的同源策略SOP(Same Orign Policy) https://segmentfault.com/a/1190000015597029
同源:
如果兩個頁面的協議,端口(如果有指定)和主機都相同,則兩個頁面具有相同的源。
協議/主機/端口
跨源網絡訪問
同源策略控制了不同源之間的交互,例如在使用XMLHttpRequest時會受到同源策略的約束。即同源策略限制了從一個源加載的文檔或者腳本如何與另一個源的資源進行交互。這是一個用於隔離潛在惡意文件的重要安全機制。
如果沒有同源策略限制的接口請求則容易被CSRF攻擊,下面是CSRF攻擊的原理:
解決方案:
CORS
CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。
它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。
CORS需要瀏覽器和服務器同時支持。
- 所有瀏覽器都支持該功能,IE瀏覽器不能低於IE10。
整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。 對於開發者來說,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺。 - 實現CORS通信的關鍵是服務器。只要服務器實現了CORS接口,就可以跨源通信。
即CORS與普通請求代碼一樣。
CORS與JSONP相比
- JSONP只能實現GET請求,而CORS支持所有類型的HTTP請求。
- 使用CORS,開發者可以使用普通的XMLHttpRequest發起請求和獲得數據,比起JSONP有更好的錯誤處理。
- JSONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數現代瀏覽器都已經支持了CORS。
@CrossOrigin註解
此註解既可用於方法也可用於類
示例如下:
@CrossOrigin(origins = "http://www.zhihu.com")
@RequestMapping(value = "/allProductions", method = RequestMethod.GET)
public Result getAllOldProductions() {
}
@CrossOrigin
註解既可註解在方法上,也可註解在類上。
XML全局配置
所有跨域請求都可以訪問
<mvc:cors>
<mvc:mapping path="/**" />
</mvc:cors>
更加細粒度的配置:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="http://domain1.com, http://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="false"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="http://domain1.com" />
</mvc:cors>