一、跨域简介
出于安全原因,浏览器禁止对当前来源之外的资源进行 AJAX 调用。例如,您可以在一个选项卡中拥有您的银行帐户,而在另一个选项卡中拥有 evil.com。来自 evil.com 的脚本不应该能够使用您的凭据向您的银行 API 发出 AJAX 请求——例如,从您的帐户中取款!
跨域资源共享 (CORS) 是大多数浏览器 实现的W3C 规范,它允许您指定授权的跨域请求类型,而不是使用基于 IFRAME 或 JSONP 的安全性较低且功能较弱的解决方法。
什么是跨域
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
二、处理跨域
1. 局部允许跨域
@CrossOrigin
在类和方法级别使用,如以下示例所示
2. 全局跨域
Spring MVC
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 跨域配置
* {@inheritDoc}
* <p>This implementation is empty.
*
* @param registry registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowCredentials(true)
.allowedHeaders("*")
.maxAge(28800)
.allowedHeaders("*");
}
}
Spring WebFlux
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowCredentials(true)
.allowedHeaders("*")
.maxAge(28800);
}
}
addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:"http://www.baidu.com",只有百度可以访问我们的跨域资源。
allowCredentials: 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以
allowedMethods:允许输入参数的请求方法访问该跨域资源服务器,如:POST、GET、PUT、OPTIONS、DELETE等。
allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:"X-YAUTH-TOKEN"maxAge:配置客户端缓存预检请求的响应的时间(以秒为单位)。默认设置为1800秒(30分钟)。