spring boot跨域

前置

同源策略是什么?

同源策略是一种约定,它是浏览器最核心也最基本的安全功能
如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。
可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
它是一个安全策略。所有支持JavaScript的浏览器都会使用这个策略

满足同源的三个条件:
所谓同源是指,域名、协议、端口相同。

为什么要同源限制?

同源策略存在的意义:

非同源下的 cookie 等隐私数据可以被随意获取。

非同源下的 DOM 可以的随意操作。

ajax 可以任意请求的话,用户的各种隐私肯定会泄露,对用户造成不同程度的损失。

同源策略的限制范围?

不能获取不同源的 cookie,LocalStorage 和 indexDB。

不能获取不同源的 DOM() 。

不能发送不同源的 ajax 请求 (可以向不同源的服务器发起请求,但是返回的数据会被浏览器拦截)。

为什么会出现跨域

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

什么是跨域

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

跨域不要重复配置

如果在网关配置了后续就不要配置了,比如在nginx或gateway配置了,后面的spring boot就不要配置了。

SpringBoot解决跨域的三种方式

方法1:添加@CrossOrigin注解

在Controller层对应的方法上添加@Controller

1
2
3
4
5
6
7
8
9
10
@RestController
@RequestMapping("index")
public class IndexController {

@GetMapping("/test")
@CrossOrigin
public String index() {
return "hello world";
}
}

方法2:实现WebMvcConfigurer,重写addCorsMappings方法

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class CorsConfiguration implements WebMvcConfigurer {

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}

根据spring boot 版本 调用 allowedOrigins 还是allowedOriginPatterns

方法3:添加CORS过滤器

新建配置类CorsConfig,创建CorsFilter过滤器,允许跨域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
public class CorsConfig {
// 跨域请求处理
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
//允许所有域名进行跨域调用
config.addAllowedOrigin("*");
//允许所有请求头
config.addAllowedHeader("*");
//允许所有方法
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}

有前置的filter,要把跨域的filter设置为最小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 1 设置访问源地址
corsConfiguration.addAllowedOrigin("*");
// 2 设置访问源请求头
corsConfiguration.addAllowedHeader("*");
// 3 设置访问源请求方法
corsConfiguration.addAllowedMethod("*");
return corsConfiguration;
}

@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 5 对接口配置跨域设置
source.registerCorsConfiguration("/**", buildConfig());
//有多个filter时此处设置改CorsFilter的优先执行顺序
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}

}

spring boot跨域
http://hanqichuan.com/2022/05/21/spring/spring boot跨域/
作者
韩启川
发布于
2022年5月21日
许可协议