解决跨域问题的6种方案

devtools/2025/3/17 4:57:00/

解决跨域问题(Cross-Origin Resource Sharing, CORS)是 Web 开发中常见的需求,以下是 6 种主流解决方案,涵盖前端、后端和服务器配置等不同层面:


一、CORS(跨域资源共享)

原理

通过服务器设置响应头 Access-Control-Allow-Origin,允许指定域访问资源。

实现

后端代码示例(Node.js/Express):

app.use((req, res, next) => {res.header("Access-Control-Allow-Origin", "*"); // 允许所有域res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");res.header("Access-Control-Allow-Headers", "Content-Type, Authorization");next();
});
适用场景
  • 标准化方案,支持所有 HTTP 方法(GET/POST/PUT/DELETE 等)。
  • 需要后端配合,适合前后端分离的生产环境。

二、代理服务器(Proxy)

原理

通过同源服务器转发请求,绕过浏览器跨域限制。

实现

前端开发环境(Vue/React):

// vue.config.js
module.exports = {devServer: {proxy: {"/api": {target: "http://target-server.com",changeOrigin: true,pathRewrite: { "^/api": "" }}}}
};

生产环境(Nginx 反向代理):

server {listen 80;server_name frontend.com;location /api/ {proxy_pass http://backend.com/;proxy_set_header Host $host;}
}
适用场景
  • 开发环境常用,生产环境通过 Nginx 配置。
  • 无需修改前端代码,适合无法修改后端的场景。

三、JSONP(JSON with Padding)

原理

利用 <script> 标签不受跨域限制的特性,通过回调函数传递数据。

实现

前端代码:

function handleResponse(data) {console.log("Received data:", data);
}const script = document.createElement("script");
script.src = "http://api.com/data?callback=handleResponse";
document.body.appendChild(script);

后端代码(Node.js):

app.get("/data", (req, res) => {const callback = req.query.callback;const data = { message: "Hello JSONP" };res.send(`${callback}(${JSON.stringify(data)})`);
});
适用场景
  • 仅支持 GET 请求。
  • 适用于老旧浏览器或无需敏感数据交互的场景。

四、WebSocket

原理

WebSocket 协议不受同源策略限制,可双向通信。

实现

前端代码:

const socket = new WebSocket("ws://api.com/socket");
socket.onmessage = (event) => {console.log("Received:", event.data);
};

后端代码(Node.js/ws 库):

const WebSocket = require("ws");
const server = new WebSocket.Server({ port: 8080 });server.on("connection", (socket) => {socket.send("Connected!");
});
适用场景
  • 实时通信(如聊天、股票行情)。
  • 需要全双工通信的场景。

五、PostMessage + iframe

原理

通过 postMessage API 实现跨域窗口通信。

实现

父页面(parent.com):

const iframe = document.getElementById("child-iframe");
iframe.contentWindow.postMessage("Hello from parent", "http://child.com");

子页面(child.com):

window.addEventListener("message", (event) => {if (event.origin === "http://parent.com") {console.log("Received:", event.data);}
});
适用场景
  • 跨域页面间通信(如嵌入第三方组件)。
  • 需要安全验证 event.origin

六、Nginx 反向代理

原理

通过 Nginx 配置将请求转发到目标服务器,统一解决跨域问题。

实现
server {listen 80;server_name frontend.com;location /api/ {proxy_pass http://backend.com/;add_header Access-Control-Allow-Origin *;}
}
适用场景
  • 生产环境推荐方案。
  • 统一管理跨域配置,减少后端压力。

方案对比表

方案优点缺点适用场景
CORS标准化,支持所有 HTTP 方法需后端配合前后端分离的生产环境
代理服务器(Proxy)无需后端修改,开发便捷仅开发环境或需配置 Nginx开发环境/生产环境反向代理
JSONP兼容性好仅支持 GET老旧浏览器或简单数据获取
WebSocket实时双向通信需额外维护 WebSocket 服务实时聊天、通知推送
PostMessage安全可控依赖 iframe 嵌套跨域页面间通信
Nginx 反向代理统一配置,性能高需运维介入配置生产环境大规模服务

总结

  • 开发环境:优先使用代理服务器(如 Vue/React 的 devServer 配置)。
  • 生产环境:推荐 CORS 或 Nginx 反向代理。
  • 实时通信:使用 WebSocket。
  • 遗留系统:JSONP 或 PostMessage。

根据具体场景选择最合适的方案,避免过度设计。


http://www.ppmy.cn/devtools/167442.html

相关文章

贪心算法简介(greed)

前言&#xff1a; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每个决策阶段都选择当前最优解的算法策略&#xff0c;通过局部最优的累积来寻求全局最优解。其本质是"短视"策略&#xff0c;不回溯已做选择。 什么是贪心、如何来理解贪心(个人对贪心的…

conda install 和 pip install 的区别

conda install 和 pip install 是两个常用的包安装命令&#xff0c;但它们在很多方面存在差异。 1. 所属管理系统不同 1.1 conda install conda install 是Anaconda和Miniconda发行版自带的包管理工具 conda 的安装命令。conda 是一个跨平台的开源包管理系统和环境管理系统&…

大语言模型基础之‘显存优化‘

上一篇可扩展的训练技术(二)中&#xff0c;我们介绍了零冗余优化器&#xff08;Zero Redundancy Optimizer, Zero&#xff09;&#xff0c;该技术由DeepSpeed代码库提出&#xff0c;主要用于解决数据并行中的模型冗余技术&#xff0c;即在数据并行训练中&#xff0c;每个GPU上都…

Unity开发的抖音小游戏接入抖音开放平台中的流量主(抖音小游戏接入广告)

前言:作者在进行小游戏审核版本的过程中,碰到了下列问题,所以对这个抖音小游戏接入广告研究了下。 还有就是作者的TTSDK版本号是6.2.6,使用的Unity版本是Unity2022.3.29f1,最好和作者的两个版本号保持一致,因为我发现TTSDK旧版的很多函数在新版中就已经无法正常使用了,必…

蓝桥杯 3514子串简写

问题描述 程序猿圈子里正在流行一种很新的简写方法&#xff1a;对于一个字符串&#xff0c;只保留首尾字符&#xff0c;将首尾字符之间的所有字符用这部分的长度代替。例如 internation-alization 简写成 i18n&#xff0c;Kubernetes &#xff08;注意连字符不是字符串的一部分…

Qt 数据库操作(Sqlite)

数据库简介 关于数据库的基础知识这里就不做介绍了&#xff0c;相关博客可以查看&#xff1a; SQL基础知识 数据库学霸笔记 上面博客都写的比较详细&#xff0c;本文主要介绍如何使用Qt进行数据库相关操作&#xff0c;数据库分为关系型数据库和非关系型数据&#xff0c;关系…

datax-coud部署

centos7系统环境安装 jdk1.8安装 cd /usr/local 上传jdk文件到/usr/local目录下解压缩 tar -zxvf jdk-8u261-linux-x64.tar.gz# 配置环境变量 vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.8.0_261 export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib export PATH=$JAVA_…

前端UI编程基础知识:基础三要素(结构→表现→行为)

以下是重新梳理的前端UI编程基础知识体系&#xff0c;结合最新技术趋势与实战要点&#xff0c;以更适合快速掌握的逻辑结构呈现&#xff1a; 一、基础三要素&#xff08;结构→表现→行为&#xff09; 1. HTML5 核心能力 • 语义化标签&#xff1a;<header>, <nav&g…