跨域问题(CORS)

1. 同源策略与跨域定义

(1)同源策略

浏览器的安全策略,要求 AJAX 请求的协议、域名、端口三者完全一致(即 “同源”),否则拦截请求。

(2)跨域场景

当请求的协议、域名、端口任一与当前页面不一致时,即为跨域。例如:

  • 页面地址:http://localhost(端口默认 80)
  • 请求地址:http://localhost:8080(端口不同)
  • 页面地址:http://127.0.0.1
  • 请求地址:http://localhost(域名不同,即使指向同一 IP)

2. 跨域请求的特殊行为

复杂跨域请求(如 POST、PUT)会先发一次OPTIONS预请求,询问服务器是否允许当前域名访问;服务器允许后,才会发送真正的业务请求。

3. 后端解决方案

(1)使用 @CrossOrigin 注解

  • 位置:添加在控制器类上(如EmployeeRestController),作用于该类所有接口。
  • 原理:服务器响应时自动添加Access-Control-Allow-Origin响应头,默认允许所有域名(*)访问。
  • 示例:
1
2
3
4
@CrossOrigin // 允许所有域跨域访问
@RestController
@RequestMapping("/api/v1")
public class EmployeeRestController { ... }

(2)自定义配置(进阶)

若需指定允许的域名、方法,可通过配置类实现,例如:

1
2
3
4
5
6
7
8
9
10
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**") // 对指定路径生效
.allowedOrigins("http://localhost:8081") // 允许的前端域名
.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法
.allowCredentials(true); // 是否允许携带Cookie
}
}