# 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
