【SpringMVC】解決跨域問題的兩種方式

widiot1發表於2018-06-11

1. 跨域

1.1 什麼是跨域

跨域,即跨站HTTP請求(Cross-site HTTP request),指發起請求的資源所在域不同於請求指向資源所在域的HTTP請求。

這是瀏覽器對JavaScript的同源策略的限制,例如a.com下面的js不能呼叫b.com中的js、物件或資料(因為a.com和b.com是不同的域)。對於http://www.a.com/a.js訪問其它URL,更詳細的說明如下表所示:

URL 說明 是否允許通訊
http://www.a.com/b.js 同一域名下 允許
http://www.a.com/script/b.js 同一域名下不同資料夾 允許
http://www.a.com:8000/b.js 同一域名,不同埠 不允許
https://www.a.com/b.js 同一域名,不同協議 不允許
http://70.32.92.74/b.js 域名和域名對應ip 不允許
http://script.a.com/b.js 主域相同,子域不同 不允許
http://a.com/b.js 同一域名,不同二級域名(同上) 不允許
http://www.b.com/b.js 不同域名 不允許

同域的概念又是什麼呢?

簡單的解釋就是具有相同的域名(a.com)、埠(8080)和協議(http)。同源策略:請求的URL地址,必須與瀏覽器上的URL地址處於同域。

比如:本地上的域名是a.com,請求b.com的資料,這個時候在瀏覽器上會報錯,這個就是同源策略的保護,如果瀏覽器對JavaScript沒有同源策略的保護,那麼一些重要的機密網站將會很危險。

1.2 跨域的應用情景

當使用前後端分離,後端主導的開發方式進行前後端協作開發時,常常有如下情景:

  1. 後端開發完畢在伺服器上進行部署並給前端API文件
  2. 前端在本地進行開發並向遠端伺服器上部署的後端傳送請求

在這種開發過程中,如果前端想要一邊開發一邊測試介面,就需要使用跨域的方式。

2. SpringMVC跨域問題

2.1 通過註解方式

如果Spring版本為4.2+,則可以在Controller類或其方法上加@CrossOrigin註解,來使之支援跨域:

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/User")
public class UserController {
	// other code
}

其中origins@CrossOrigin的預設引數,即跨域來源,*表示任何來源,也可以是其它域名。比如如下形式:

@CrossOrigin("http://localhost:4200")
@CrossOrigin(origins={"http://localhost:4200", "http://localhost:4242"})
@CrossOrigin(origins="http://localhost:4200",maxAge=3600)

該註解用於方法上時寫法相同,SpringMVC處理時會對類和方法上的標籤進行合併。

2.2 通過配置檔案

註解方式可以實現細粒度的跨域控制,而通過配置檔案可以實現全域性的跨域,在springmvc-config.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>

3. 參考資料

相關文章