什么是跨域
跨域由于浏览器的同源策略造成的。同源策略是指,通过浏览器脚本发起一次请求(如AJax),这次请求的URL与当前的URL的协议,域名和端口必须相同,如果有一个不相同,则构成跨域。
注意点:
1.非浏览器环境无跨域。
2.跨域针对的是浏览器脚本发起的请求,如地址栏直接输入URL,是不会构成跨域的。
3.跨域是指一次请求,判断该次请求和当前页面URL的协议,域名和端口。
如何解决跨域
一.CORS(跨域资源共享)
原理:服务端通过响应头声明允许的跨域来源、方法和头部。
实现方式:
1.Spring Boot配置
- 局部配置 :使用
@CrossOrigin
注解
@RestController
@CrossOrigin(origins = "https://frontend.com", methods = {RequestMethod.GET, RequestMethod.POST})
public class MyController { ... }
- 全局配置 :实现
WebMvcConfigurer
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://frontend.com")
.allowedMethods("GET", "POST")
.allowCredentials(true); // 允许携带Cookie
}
}
2.原生Servlet:在过滤器中设置响应头
response.setHeader("Access-Control-Allow-Origin", "https://frontend.com");
适用场景:前后端分离项目、API服务需开放给特定前端域名
二、反向代理------基础设施层方案
原理:通过同源代理服务器(如 Nginx)转发请求,绕过浏览器限制
server {
listen 80;
server_name frontend.com;
location /api/ {
proxy_pass http://backend-server:8080/; # 转发到后端
add_header 'Access-Control-Allow-Origin' '*'; # 可选,双重保障
}
}
优势:
-
无需修改代码,适用于任何后端语言
-
可缓存静态资源、负载均衡,提升性能
-
隐藏真实后端 IP,增强安全性
适用场景:生产环境部署、微服务架构、多域名整合