【跨域问题】

跨域问题

官方概念:

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

本质来说,是前端请求给到后端时候,请求头里面,有一个 Origin ,会带上 协议域名端口号等;后端接受到请求;如果没有在"返回头"里面放上"一些东西",返回的时候,浏览器根据"同源策略",就不会接受到返回;

注意:

shell 复制代码
Sec-Fetch-Site 头部有几个可能的值:
	same-origin: 请求源和目标是同一个站点
	same-site: 请求源和目标在同一个站点组(比如 sub1.example.com 和 sub2.example.com)
	cross-site: 跨站点请求
	none: 请求不是由网站发起的(比如用户直接在地址栏输入URL)

我们来看两个例子:

这张是微博的任意页面刷新出来的东西:

这一个请求就没有跨域啥的,

然后我们看一个 B站的例子:

其实涉及到两个概念:

Origin是发出方。Host是目的地:这里可以看上面请求里B站的Host

解决

后端,返回的头里加上一个允许标记:给放过;

代码仅供参考,实际要根据业务需求情况,还有一些其他配置,这里关注:config.addAllowedOrigin("http://localhost:3000");

java 复制代码
// 方案1:后端配置 CORS(跨域资源共享)
@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        
        // 生产环境应该明确指定允许的域名
        config.addAllowedOrigin("https://www.your-domain.com");
        // 如果有多个域名,可以分别添加
        config.addAllowedOrigin("https://admin.your-domain.com");
        
        // 明确指定允许的请求方法,而不是使用 "*"
        config.addAllowedMethod("GET");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("DELETE");
        
        // 明确指定允许的头部,而不是使用 "*"
        config.addAllowedHeader("Authorization");
        config.addAllowedHeader("Content-Type");
        
        // 是否允许发送Cookie
        config.setAllowCredentials(true);
        
        // 预检请求的有效期,单位为秒
        config.setMaxAge(3600L);
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/api/**", config);
        
        return new CorsFilter(source);
    }
}

从前端也可以处理,生产环境的话,可以在Nginx里面配置

shell 复制代码
server {
    listen 80;
    server_name example.com;

    # 前端静态文件
    location / {
        root /path/to/dist;
        try_files $uri $uri/ /index.html;
    }

    # 后端 API 代理
    location /api {
        # 跨域配置
        add_header Access-Control-Allow-Origin '*';  # 生产环境建议配置具体域名
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        
        # 处理 OPTIONS 预检请求
        if ($request_method = 'OPTIONS') {
            return 204;
        }

        # 反向代理配置
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

时光海海,日常焦虑 🍀,加油

相关推荐
阿成学长_Cain1 小时前
Linux telinit 命令详解:运行级别切换|关机重启|系统维护一站式掌握
linux·运维·前端·网络
淘源码d1 小时前
医学影像云PACS系统——PACS诊断工作站
java·源码·影像处理·医院管理系统·影像工作站·云pacs系统·dicom 标准通信
Patrick_Wilson1 小时前
最佳实践是有保质期的:从一次 CDN external 白屏事故说起
前端·性能优化·前端工程化
YHHLAI1 小时前
[特殊字符] Agent 智能体开发实战 · 第一课:Tool Use —— 让大模型自动干活
前端·人工智能
nuIl2 小时前
我把 5 个编码 Agent 塞进了一个 npm 包
前端·agent·claude
L-影2 小时前
FastAPI 静态文件:Web 页面的“固定展柜”与“加速引擎”
前端·fastapi
NiceCloud喜云2 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
陪我去看海2 小时前
受够了 AI 写完代码留下一堆端口?我做了一个端口管理App!
前端·macos·vibecoding
Xuepoo2 小时前
我抛弃了 DOM,但保留了无障碍访问
前端
李明卫杭州2 小时前
Vue2 vs Vue3 的 h 函数:渲染函数完整迁移指南
前端