# Spring Boot 的跨域訪問
## CORS簡介
- 做WEB開發,特別是前后端分離之后,跨域就是一個不可避免的問題,解決方案也比較多,如jsonp,iframe等,這里我們要說的是**CORS**。
- 許多人還沒意識到當前幾乎所有的瀏覽器都可通過名為 **跨域資源共享(Cross-Origin Resource Sharing)** 的協議支持ajax跨域調用。對一個簡單的請求,沒有自定義頭部,要么使用GET,要么使用POST,它的主體是text/plain,請求用一個名叫Orgin的額外的頭部發送。Origin頭部包含請求頁面的頭部(協議,域名,端口),這樣服務器可以很容易的決定它是否應該提供響應。
- CORS支持的瀏覽器有:
- Chrome 3+
- Firefox 3.5+
- Opera 12+
- Safari 4+
- Internet Explorer 8+
> CORS 并不是Spring Boot的功能,而是SpringMVC4.2以后開始的
## CORS與JSONP比較:
1. JSONP 只能實現 GET 請求,而 CORS 支持所有類型的 HTTP 請求。
2. 使用 CORS,開發者可以使用普通的 XMLHttpRequest 發起請求和獲得數據,比起 JSONP 有更好的
錯誤處理。
3. JSONP 主要被老的瀏覽器支持,它們往往不支持 CORS,而絕大多數現代瀏覽器都已經支持了 CORS
## 全局控制方案
```
/**
* 全局跨域訪問
* @author LiuYin
*/
@Configuration
@EnableWebMvc
public class CorsConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 這個是比較完整的實例
registry.addMapping("/api/**")
.allowedOrigins("http://luyou.com")
.allowedMethods("PUT","GET")
.allowedHeaders("header1","header2","header3")
.exposedHeaders("headr5","header4")
.allowCredentials(false)
.maxAge(3600);
// 一般默認也可以這樣
registry.addMapping("/api/**")
.allowedOrigins("http://luyou.com");
}
}
```
## 局部控制方案(注解)
```
@PostMapping("/save")
@CrossOrigin(origins = "http://luyou.com")
public long save(User user){
return userService.save(user);
}
```
> @CrossOrigin也可以注解在類上
注意:必須明確RequestMethod,如GET、POST