前端解决跨域的几种方案

news/2025/3/22 0:20:46/

以下是前端解决跨域问题的 7 种主流方案,根据应用场景和实现难度排序,附详细实现示例:


一、开发环境解决方案

1. Webpack DevServer 代理(推荐)
// vue.config.js / webpack.config.js
module.exports = {devServer: {proxy: {'/api': {target: 'http://backend-domain.com', // 后端地址changeOrigin: true,                 // 修改请求头HostpathRewrite: { '^/api': '' }         // 路径重写}}}
}

原理前端请求 /api/users → DevServer 转发到 http://backend-domain.com/users


2. 浏览器禁用安全策略(临时调试)
# macOS
open -n -a "Google Chrome" --args --disable-web-security --user-data-dir=/tmp/chrome# Windows 快捷方式属性追加
chrome.exe --disable-web-security --user-data-dir="C:/temp"

注意:仅限本地开发,需关闭所有 Chrome 实例后执行


二、生产环境解决方案

3. Nginx 反向代理
server {listen 80;server_name your-domain.com;location /api {proxy_pass http://backend-ip:8080;  # 后端服务地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}location / {root /usr/share/nginx/html;  # 前端静态资源try_files $uri $uri/ /index.html;}
}

优势:前后端同域,天然避免跨域问题


4. CORS(跨域资源共享)

需后端配合设置响应头:

Access-Control-Allow-Origin: https://your-frontend.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true  # 允许携带Cookie

前端代码示例

// 需要携带凭证时
fetch('https://api-domain.com/data', {credentials: 'include' // 或 'same-origin'
});

三、特殊场景方案

5. JSONP(仅限 GET 请求)
function jsonp(url, callback) {const script = document.createElement('script');script.src = `${url}?callback=${callback}`;document.body.appendChild(script);
}// 后端需返回:callbackName({ data: ... })
jsonp('http://backend.com/api', 'handleResponse');function handleResponse(data) {console.log('Received:', data);
}

6. WebSocket
const socket = new WebSocket('ws://backend-domain.com/socket');socket.onmessage = (event) => {console.log('Received:', JSON.parse(event.data));
};// 发送消息
socket.send(JSON.stringify({ action: 'getData' }));

7. postMessage(跨窗口通信)

主窗口

// 发送消息到 iframe
document.querySelector('iframe').contentWindow.postMessage({ type: 'request', data: '需要传输的数据' },'https://target-domain.com'
);

iframe 接收方

window.addEventListener('message', (event) => {if (event.origin !== 'https://parent-domain.com') return;console.log('Received:', event.data);
});

方案对比表

方案适用场景是否需要后端配合安全性请求类型支持
DevServer 代理本地开发所有
Nginx 代理生产环境所有
CORS生产环境所有
JSONP旧浏览器兼容仅 GET
WebSocket实时通信双向通信
postMessage跨窗口通信自定义消息
禁用浏览器安全策略本地临时调试极低所有

最佳实践建议

  1. 开发阶段:优先使用 Webpack DevServer 代理
  2. 生产环境
    • 首选 Nginx 反向代理
    • 需要多后端服务时使用 CORS
  3. 特殊需求
    • 实时通信 → WebSocket
    • 旧系统兼容 → JSONP
  4. 安全规范
    • 避免使用 Access-Control-Allow-Origin: *
    • 敏感接口需要 CORS + 身份验证双重保护

可根据实际项目需求组合使用多种方案,如开发环境用代理 + 生产环境用 Nginx + 特殊接口用 CORS。


http://www.ppmy.cn/news/1581015.html

相关文章

Qt-QChart实现折线图

一、介绍场景 动态查看数据变化,或者了解数据发展趋势,让数据可以形象直观展现出来,这里推荐使用折线图的方式展现,本文抛砖引玉,简单实现一个实例,效果图如下: 二、实现步骤 1、charts组件 …

解决qt中自定插件加载失败,不显示问题。

这个问题断断续续搞了一天多,主要是版本不匹配问题。 我们先来看下 Based on Qt 6.6.0 → 说明 Qt Creator 本身 是基于 Qt 6.6.0 框架构建的。MSVC 2019, 64-bit → 说明 Qt Creator 是使用 Microsoft Visual C 2019 编译器(64 位) 编译的。…

2024年河南省职业院校 技能大赛高职组 “大数据分析与应用” 赛项任务书(四)

2024 年河南省职业院校 技能大赛高职组 “大数据分析与应用” 赛项任务书(四)) 背景描述:任务一:Hadoop 完全分布式安装配置(25 分)任务二:离线数据处理(25 分&#xff0…

Dify + Agent实现自然语言查询Mysql数据库并分析

问题是,我配置完AGENT中的提示词、变量、知识库、工具后,比如我输入“查询用户信息”,按照 【知识库】中的文件信息,生成的sql应该是 “select * from sys_user”等sql,但现在情况是,生成的sql中的表信息&#xff0…

网络安全常识科普(百问百答)

汪乙己一到店,所有喝酒的人便都看着他笑,有的叫道,“汪乙己,你又监控员工隐私了!”他不回答,对柜里说,“来两个fofa。”便排出三个比特币。他们又故意的高声嚷道,“你一定又在电报群…

《基于Spring Boot+Vue的智慧养老系统的设计与实现》开题报告

个人主页:@大数据蟒行探索者 一、研究背景及国内外研究现状 1.研究背景 根据1982年老龄问题世界大会联合国制定的标准,如果一个国家中超过65岁的老人占全国总人口的7%以上,或者超过60岁的老人占全国总人口的10%以上,那么这个国家将被定义为“老龄化社会”[1]。 随着国…

PHP转GO Go语言环境搭建(Day1) 常见问题及解决方案指南

Go语言环境搭建(Day1)整理的 常见问题及解决方案指南: Go环境搭建问题排查手册 一、安装阶段问题 问题现象原因分析解决方案安装包下载失败网络问题或官网访问慢使用国内镜像下载:- Go中文网提示"Access Denied"Windows系统权限不足1. 右键安装包选择"以管理…

大数据学习(77)-Hive详解

🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…