1.什么是跨域

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

image-20240321001946936

2.跨域的解决方案

一、SpringBoot 通过注解解决跨域

可以在我们的控制器类或控制器方法上添加,添加在类上表示里面所有方法都可跨域,添加在方法上表示指定方法可以跨域,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
@GetMapping
public String getAll() {
return "成功";
}
}

二、SpringBoot 配置 CORS 解决跨域

即在我们所有响应头配置允许跨域访问,CORS也已经成为主流的跨域解决方案。

  1. 在项目中创建一个新的配置文件
  2. 添加@Configuration注解实现WebMvcConfigurer接口
  3. 重写addCorsMappings方法并设置允许跨域的代码

三、SpringBoot 通过 CorsFilter 解决跨域

这种方式和上面的方式类似,但是主要是通过过滤器进行跨域,也是通过Java Config的方式配置跨域访问,具体代码如下:

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
26
27
28
29
java复制代码import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class MyCorsFilter {
@Bean
public CorsFilter corsFilter() {
// 1.创建 CORS 配置对象
CorsConfiguration config = new CorsConfiguration();
// 支持域
config.addAllowedOriginPattern("*");
// 是否发送 Cookie
config.setAllowCredentials(true);
// 支持请求方式
config.addAllowedMethod("*");
// 允许的原始请求头部信息
config.addAllowedHeader("*");
// 暴露的头部信息
config.addExposedHeader("*");
// 2.添加地址映射
UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**", config);
// 3.返回 CorsFilter 对象
return new CorsFilter(corsConfigurationSource);
}
}

四、通过 nginx 配置 CORS 解决跨域

如果我们项目有用 nginx 做反向代理服务器时,也可以在nginx中配置CORS来解决跨域

问:什么是nginx反向代理?如何实现跨域的?

正向代理 :a->b->c a是客户端想访问c,通过代理服务器b来访问外网服务器c

–所以,正向代理,其实是”代理服务器”代理了”客户端”,去和”目标服务器”进行交互。–

正向代理的好处有:

​ 1.可以突破访问自身ip限制

​ 2.由于代理服务器中有较大的硬盘缓存区,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。

​ 3.隐藏客户端真实IP

反向代理:a->b–冒充–c a想访问c ,但是b代理了c,给a返回结果

–所以,反向代理,其实是”代理服务器”代理了”目标服务器”,去和”客户端”进行交互。–

反向代理的好处:

​ 1.实现负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。

​ 2.提高访问速度, 反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。

​ 3.隐藏服务器真实ip

3.综合比较

  • 简便性:注解方式最为简单,适合快速开发或小型项目。
  • 集中管理与控制力:通过配置文件或CorsFilter能更集中地管理跨域策略,适合中大型项目。
  • 性能与透明性:nginx配置最优,适合需要高性能和有nginx环境的项目。

​ 选择哪种方案取决于项目的具体需求、开发与维护成本以及预期的控制精度。通常,小型或初期项目可能更倾向于使用注解或简单配置,而中大型项目则可能需要更细粒度的控制,如通过CorsFilter或nginx配置来满足复杂的跨域需求。