跨域问题说明

什么是跨域

跨域由于浏览器的同源策略造成的。同源策略是指,通过浏览器脚本发起一次请求(如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,增强安全性

    适用场景:生产环境部署、微服务架构、多域名整合