SpringBoot解决跨域问题
什么是跨域
源(origin)就是协议、域名和端口号。
URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口全部相同,则表示他们同源。否则,只要协议、域名、端口有任何一个不同,就是跨域。
对比
URL | 是否跨域 | 原因 |
---|---|---|
https://www.csdn.com/more/index.html | 不跨域 | 三要素相同 |
https://map.csdn.com/more/index.html | 跨域 | 域名不同 |
https://www.csdn.com:8999/more/index.html | 跨域 | 端口不同 |
http://www.csdn.com/more/index.html | 跨域 | 协议不同 |
同源策略
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
同源策略又分为以下两种:
- DOM同源策略: 禁止对不同源页面DOM 进行操作。这里主要场景是iframe跨域的情况,不同域名的iframe是限制互相访问的。
- XMLHttpRequest同源策略: 禁止使用XHR对象向不同源的服务器地址发起HTTP请求。
如何解决
方案一 配置类解决
创建Config配置类实现WebMvcConfigurer接口
/*
* 1、addMapping 允许访问路径
* 2、allowedOrigins 添加跨域请求来源
* 3、allowedMethods 允许跨域的方法
* 4、allowCredentials 是否允许携带信息
* 5、maxAge 最大响应时间
* 6、allowedHeaders 允许访问请求头
*/
@Configuration
public class CrosConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
}
方案二 添加@CrossOrigin注解
SpringBoot版本为2.X及以上
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private BookRepository bookRepository;
/**
* @CrossOrigin 解决跨域问题
* 作用范围:类与方法
* 属性:
* origins:允许可访问的与列表 可填多个
* maxAge:准备响应前的缓存最大持续时间 默认-1
* @return
*/
@CrossOrigin
@GetMapping("/findAll")
public List<Book> findAll() {
return bookRepository.findAll();
}
}
工作原理
CORS请求(包括预选的带有选项方法)被自动发送到注册的各种HandlerMapping
。它们处理CORS准备请求并拦截CORS简单和实际请求,这得益于CorsProcessor
实现(默认情况下默认DefaultCorsProcessor
处理器),以便添加相关的CORS响应头(如Access-Control-Allow-Origin
)。 CorsConfiguration
允许您指定CORS请求应该如何处理:允许origins, headers, methods等。
AbstractHandlerMapping#setCorsConfiguration()
允许指定一个映射,其中有几个CorsConfiguration
映射在路径模式上,比如/api/**。- 子类可以通过重写
AbstractHandlerMapping
类的getCorsConfiguration(Object, HttpServletRequest)
方法来提供自己的CorsConfiguration
。 - 处理程序可以实现
CorsConfigurationSource接口
(如ResourceHttpRequestHandler
),以便为每个请求提供一个CorsConfiguration
。
感谢阅读!!!