解决跨域问题的6种方案

解决跨域问题(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.mzph.cn/news/897633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。

文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载&#xff08;以Chrome和Edge为例&#xff09;3 基础使用&#xff08;以Chrome为例演示&#xff09;3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…

50个经典的python库

本文整理了50个可以迅速掌握的经典Python库&#xff0c;了解它们的用途&#xff0c;无论你是刚踏上编程之路&#xff0c;还是希望在Python的世界里更加深入&#xff0c;这50个库都能帮助你快速起飞。 1. Taipy Taipy是一个开源Python库&#xff0c;用于轻松的端到端应用程序开…

【视频】V4L2、ffmpeg、OpenCV中对YUV的定义

1、常见的YUV格式 1.1 YUV420 每像素16位 IMC1:YYYYYYYY VV-- UU– IMC3:YYYYYYYY UU-- VV– 每像素12位 I420: YYYYYYYY UU VV =>YUV420P YV12: YYYYYYYY VV UU =>YUV420P NV12: YYYYYYYY UV UV =>YUV420SP(最受欢迎格式) NV21: YYYYYYYY VU VU =>YUV420SP…

freeswitch(多台服务器级联)

亲测版本centos 7.9系统–》 freeswitch1.10.9本人freeswitch安装路径(根据自己的路径进入)/usr/local/freeswitch/etc/freeswitch使用场景: 使用服务器级联需要双方网络可以ping通,也就是类似局域网内,比如A服务器IP 192.168.1.100 B服务器 192.168.1.101,通过C设备注册…

SpringMVC 基本概念与代码示例

1. SpringMVC 简介 SpringMVC 是 Spring 框架中的一个 Web 层框架&#xff0c;基于 MVC&#xff08;Model-View-Controller&#xff09; 设计模式&#xff0c;提供了清晰的分层结构&#xff0c;适用于 Web 应用开发 SpringMVC 主要组件 DispatcherServlet&#xff08;前端控…

LuaJIT 学习(1)—— LuaJIT介绍

文章目录 介绍Extensions Modulesbit.* — Bitwise operationsffi.* — FFI libraryjit.* — JIT compiler controlC API extensionsProfiler Enhanced Standard Library Functionsxpcall(f, err [,args...]) passes arguments例子&#xff1a; xpcall 的使用 load*() handle U…

std::ranges::views::common, std::ranges::common_view

std::ranges::views::common, std::ranges::common_view C20 引入的用于将范围适配为“通用范围”的工具&#xff0c;主要解决某些算法需要传统迭代器对&#xff08;如 begin 和 end 类型相同&#xff09;的问题。 基本概念 1. 功能 适配传统算法&#xff1a;将范围&#x…

4.3 数组和集合的初始及赋值

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商…

分布式光伏发电的发展现状与前景

分布式光伏发电的发展现状与前景 1、分布式光伏发电的背景2、分布式光伏发电的分类2.1、集中式光伏发电2.1.1、特点、原则2.1.2、优点2.1.3、缺点 2.2、分布式光伏发电2.2.1、特点、原则2.2.2、优点2.2.3、缺点 2.3、对比 3、分布式光伏发电的现状4、分布式光伏发电的应用场景4…

13 | 实现统一的错误返回

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…

DeepSeek结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)转载

思维速览&#xff1a; 本文将详细介绍如何利用DeepSeek结合Mermaid语法绘制各类专业图表&#xff0c;帮助你提高工作效率和文档质量。 ▍DeepSeek入门使用请看&#xff1a;deepseek保姆级入门教程&#xff08;网页端使用 本地客户端部署 使用技巧&#xff09; DeepSeek官网…

Java静态变量与PHP静态变量的对比

Java的静态变量在多线程并发的情况下是线程共有的。以下是关键点总结&#xff1a; 存储位置&#xff1a;静态变量属于类&#xff0c;存储在方法区&#xff08;或元空间&#xff09;&#xff0c;这是所有线程共享的内存区域。因此&#xff0c;所有线程访问的都是同一个静态变量实…

c++20 Concepts的简写形式与requires 从句形式

c20 Concepts的简写形式与requires 从句形式 原始写法&#xff08;简写形式&#xff09;等效写法&#xff08;requires 从句形式&#xff09;关键区别说明&#xff1a;组合多个约束的示例&#xff1a;两种形式的编译结果&#xff1a;更复杂的约束示例&#xff1a;标准库风格的约…

上下分层、左右分离的驱动设计思想

之前了解了最简单的驱动程序、但是不易扩展、现在继续学习、上下分层、左右分离的驱动设计思想。 1、led_dev.c函数 上层函数&#xff0c;①定义一个结构体&#xff0c;存储函数用来接应app的函数。②定义一个入口函数&#xff0c;将我们接应的函数告诉内核&#xff0c;给这个…

人工智能在医疗领域的应用:技术革新与未来展望

人工智能&#xff08;AI&#xff09;技术正在重塑医疗行业的面貌。从辅助诊断到药物研发&#xff0c;从健康管理到手术机器人&#xff0c;AI的广泛应用不仅提升了医疗效率&#xff0c;还为精准医疗和个性化治疗提供了新可能。根据2025年多份研究报告及政策文件&#xff0c;全球…

《历史代码分析》5、动态控制列表的列

​​ 本系列《历史代码分析》为工作中遇到具有代表性的代码。今天我们讲一下&#xff0c;动态展示列表的列&#xff0c;因为找不到代码了&#xff0c;所有本篇用图展示。 举个栗子 ​​ 我们希望能够动态的控制列表的列&#xff0c;例如&#xff0c;英语老师只想知道自己学…

Windows HD Video Converter Factory PRO-v27.9.0-

Windows HD Video Converter Factory PRO 链接&#xff1a;https://pan.xunlei.com/s/VOL9TaiuS7rXbu-1kEDndoceA1?pwd7qch# 支持300多种视频格式转换&#xff0c;在保留视频质量的同时&#xff0c;压缩率可达80%&#xff0c;转换速度可达50X速率&#xff01; 支持画面剪切、片…

C++程序设计语言笔记——抽象机制:构造、清理、拷贝和移动

0 应该将构造函数、赋值操作以及析构函数设计为一组匹配的操作。 在C中&#xff0c;构造函数、赋值操作符和析构函数共同管理对象的资源生命周期。为确保资源安全且一致地处理&#xff0c;需将它们作为一组匹配的操作设计。以下是关键要点&#xff1a; 为何需要协同设计&…

##Hive安装-初始化元数据报错 *** schemaTool failed ***

报错&#xff1a; org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version. Underlying cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure 解决方案&#xff1a; 尝试一&#xff1a;javax.jdo.o…

远程手机遥控开关原理及应用

远程手机遥控开关的工作原理主要是通过互联网传递无线信号&#xff0c;控制用电器的一种智能家居产品。 远程手机遥控开关的基本套件包括&#xff1a;手机APP、网线、家用WIFI中转无服务器或者是工厂提供的自带网线端口的中转服务器、连接用电器的接收器。使用时&#xff0c;手…