【SpringMVC】解決跨域問題的兩種方式
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 跨域的應用情景
當使用前後端分離,後端主導的開發方式進行前後端協作開發時,常常有如下情景:
- 後端開發完畢在伺服器上進行部署並給前端API文件
- 前端在本地進行開發並向遠端伺服器上部署的後端傳送請求
在這種開發過程中,如果前端想要一邊開發一邊測試介面,就需要使用跨域的方式。
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. 參考資料
相關文章
- 解決ajax跨域問題的多種方法跨域
- 解決跨域問題跨域
- 搞懂:前端跨域問題JS解決跨域問題VUE代理解決跨域問題原理前端跨域JSVue
- python bottle框架 解決跨域問題的正確方式Python框架跨域
- java解決請求跨域的兩種方法Java跨域
- SignalR跨域問題解決SignalR跨域
- Flask解決跨域問題Flask跨域
- Java解決跨域問題Java跨域
- CROS 解決跨域問題ROS跨域
- cors解決跨域問題CORS跨域
- Luffy - 解決跨域問題跨域
- WebSocket跨域問題解決Web跨域
- 解決JS跨域訪問的問題JS跨域
- Nginx解決前端跨域問題 CORS跨域配置Nginx前端跨域CORS
- 深入跨域問題(3) – 利用 JSONP 解決跨域跨域JSON
- 深入跨域問題(3) - 利用 JSONP 解決跨域跨域JSON
- 深入跨域問題(2) - 利用 CORS 解決跨域跨域CORS
- thinkphp 5 跨域問題解決PHP跨域
- 跨域問題解決辦法跨域
- JAVA | Java 解決跨域問題Java跨域
- SpringBoot跨域問題解決方案Spring Boot跨域
- 跨域問題及解決方案跨域
- 輕鬆解決跨域問題跨域
- zuul實現Cors跨域的兩種方式(https)ZuulCORS跨域HTTP
- 使用Nginx來解決跨域的問題Nginx跨域
- 九種 “姿勢” 讓你徹底解決跨域問題跨域
- Angular應用解決跨域訪問的問題Angular跨域
- 前端怎麼解決跨域問題前端跨域
- nginx /Java 解決跨域問題方案NginxJava跨域
- Flutter Web 跨域問題解決方案FlutterWeb跨域
- Django專案解決跨域問題Django跨域
- 前端解決跨域問題總結前端跨域
- nginx 解決圖片跨域問題Nginx跨域
- 解決常見介面跨域問題跨域
- vue webpack配置解決跨域問題VueWeb跨域
- 跨域問題,解決方案 – CORS方案跨域CORS
- 前端跨域問題及其解決方案前端跨域
- spring mvc解決ajax跨域問題SpringMVC跨域