跨域问题说明
什么是跨域
跨域由于浏览器的同源策略造成的。同源策略是指,通过浏览器脚本发起一次请求(如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 {@Overridepublic 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,增强安全性
适用场景:生产环境部署、微服务架构、多域名整合