当前位置: 首页 > article >正文

为什么禁止我请求别的网站的接口?——跨域与CORS _

你有没有遇到过这种情况在自己的网页上想请求别人的API结果浏览器直接报错Access-Control-Allow-Origin header is missing。为什么浏览器要阻止你服务器不响应不就完了吗今天用小区门禁的故事来讲讲跨域与CORS。什么是跨域同源策略 — 浏览器的安全基石浏览器有个同源策略Same-Origin Policy只有来自同一个家的资源才能随便用。什么叫同一个家看三个条件协议http/https、域名example.com、端口:8080。三个都一样才是同源有一个不一样就是跨域。跨域的例子12345✅ http://example.com 和 http://example.com/profile // 协议域名端口都相同 → 同源✅ https://example.com 和 https://example.com // 协议域名端口都相同 → 同源❌ http://example.com 和 https://example.com // 协议不同 → 跨域❌ http://example.com 和 http://api.example.com // 域名不同子域名→ 跨域❌ http://example.com:8080 和 http://example.com:3000 // 端口不同 → 跨域跨域限制了什么浏览器的同源策略主要限制了三件事DOM 访问无法读取不同源的 iframe 内容、无法修改不同源的 iframe DOMAJAX 请求无法请求不同源的 APICookie/LocalStorage无法访问不同源的数据为什么要限制跨域模拟一个攻击场景想象一下你登录了银行网站浏览器保存了你的登录 Cookie。然后你手滑点进了一个恶意网站这个网站里有一段代码12345form hrefhttps://urlscan.io/result/019dd18e-1f44-74de-a5be-32c1f5ea040c/methodPOSTinput typehiddennametovaluehackerinput typehiddennameamountvalue1000000/formscriptdocument.forms[0].submit();/script如果没有同源策略这个表单请求会自动带上bank.com的 Cookie银行服务器以为是你本人操作的——钱就没了。同源策略就是浏览器的门禁只有同一家人才能进陌生人要查证件。 注意img标签的 GET 请求虽然也会带 Cookie但现代浏览器有SameSiteCookie 保护。上面表单 POST 场景更典型。CORS — 跨域的通行证CORS 是什么CORSCross-Origin Resource Sharing 跨域资源共享。它的工作原理很简单让服务器告诉浏览器我允许来自这些源的请求。简单请求 vs 预检请求简单请求满足以下条件的请求是简单请求简单请求的流程12345671. 浏览器发送请求自动带上 Origin 头↓2. 服务器检查 Origin决定是否允许↓3. 服务器返回响应头 Access-Control-Allow-Origin↓4. 浏览器检查响应头允许就完事服务器端示例Node.js123456789app.get(/api/data, (req, res) {constorigin req.headers.origin;if(origin ) {res.setHeader(Access-Control-Allow-Origin, origin);}res.json({ data:这是返回的数据});});响应头12345HTTP/1.1 200 OKAccess-Control-Allow-Origin: https://example.coma hrefhttps://urlscan.io/result/019dd18e-29e6-702b-b9f9-d2445b252501//aContent-Type: application/json{data:这是返回的数据}预检请求Preflight不满足简单请求条件的浏览器会先发一个 OPTIONS 请求探路12345671. 浏览器发送 OPTIONS 预检请求↓2. 服务器检查方法/头部/Origin↓3. 服务器返回允许的头 Access-Control-*↓4. 浏览器发送实际请求预检请求检查什么预检请求OPTIONS就像登机前的安检——先检查你带没带危险品。浏览器会问服务器三件事我从哪来Origin我想用什么方法Access-Control-Request-Method我想带什么头Access-Control-Request-Headers服务器回答可以浏览器才放行实际请求。1234567891011121314# 请求浏览器发给服务器OPTIONS /api/data HTTP/1.1Origin: a hrefhttps://urlscan.io/result/019dd18e-35a3-76ab-99bf-0752d3378713//a # 我从哪来Access-Control-Request-Method: PUT # 我想用 PUT 方法Access-Control-Request-Headers: Content-Type, Authorization # 我想带这些头---# 响应服务器告诉浏览器HTTP/1.1 204 No ContentAccess-Control-Allow-Origin: a hrefhttps://urlscan.io/result/019dd18e-4068-70d2-a85c-2bfa345b23aa//a # 允许这个源Access-Control-Allow-Methods: GET, POST, PUT, DELETE # 允许这些方法Access-Control-Allow-Headers: Content-Type, Authorization # 允许这些头Access-Control-Max-Age: 86400 # 预检结果缓存24小时服务器端处理123456789101112app.options(/api/data, (req, res) {constorigin req.headers.origin;if(origin a hrefhttps://urlscan.io/result/019dd18e-4c5a-71cc-b20b-a4e8ac2ec164//a) {res.setHeader(Access-Control-Allow-Origin, origin);res.setHeader(Access-Control-Allow-Methods,GET, POST, PUT, DELETE);res.setHeader(Access-Control-Allow-Headers,Content-Type, Authorization);res.setHeader(Access-Control-Max-Age,86400);}res.status(204).send();});CORS 响应头详解常用响应头​credentials 模式默认情况下CORS不带Cookie。如果需要携带 Cookie前端123fetch(a hrefhttps://urlscan.io/result/019dd18e-58c4-72c9-b486-e6c5ab731092//a, {credentials:include});服务端12res.setHeader(Access-Control-Allow-Origin, a hrefhttps://urlscan.io/result/019dd18e-64fb-73dd-b51a-0601024a892f//a);res.setHeader(Access-Control-Allow-Credentials,true);注意Access-Control-Allow-Origin不能用*必须是具体域名。跨域的解决方案1. JSONP已不推荐利用script标签不受同源策略限制的特性123456scriptfunction handleData(data) {console.log(data);}/scripta hrefhttps://urlscan.io/result/019dd18e-700f-705d-a721-278d4d15ac80//a​2. 代理服务器在自己的服务器上转发请求伪装成同源1浏览器 ── 我的服务器同一源 ── 目标服务器Nginx 代理123location /api/ {a hrefhttps://urlscan.io/result/019dd18f-3875-71a6-a17d-cffb86fc9a00//a;}Node.js 代理12345app.get(/api/data, async (req, res) {constresponse await fetch(a hrefhttps://urlscan.io/result/019dd18f-454d-7307-bbb2-ab0a62f529b5//a);constdata await response.json();res.json(data);});3. Webpack/Vite 开发代理开发环境配置代理1234567891011// vite.config.jsexportdefault{server: {proxy: {/api: {target:http://target-server.com,changeOrigin:true}}}};4. postMessage不同窗口/iframe 之间的通信1234567window.addEventListener(message, (event) {if(event.origin https://example.com) {console.log(收到消息:,event.data);}});iframe.contentWindow.postMessage(hello,https://example.com);深入了解 CORS 第三方 Cookie 的限制现代浏览器正在逐步限制第三方 Cookie​CORS 和 CSRF 的区别​为什么 OPTIONS 叫预检预检就像登机前的安检——先检查你带没带危险品方法、头部没问题了才让你登机发送实际请求。常见错误排查错误 1No Access-Control-Allow-Origin header​错误 2Method not allowed​错误 3Header not allowed​错误 4预检请求 404​总结​写在最后现在你应该明白了跨域是浏览器的安全机制不是为了刁难你CORS 是服务器授权机制服务器说可以浏览器才放行预检请求 安检OPTIONS 通过了才能发送实际请求生产环境推荐用代理开发环境用 webpack/vite 代理下次遇到跨域错误先看浏览器控制台的报错信息——是缺通行证header 缺失还是通行证不对origin 不匹配处理方式不一样的。

相关文章:

为什么禁止我请求别的网站的接口?——跨域与CORS _

你有没有遇到过这种情况:在自己的网页上想请求别人的API,结果浏览器直接报错:Access-Control-Allow-Origin header is missing。为什么浏览器要阻止你?服务器不响应不就完了吗? 今天,用小区门禁的故事&…...

记忆碎片化测试标准:软件测试领域的新兴挑战与应对框架

在数字化与信息爆炸的时代,人类的认知模式正经历着深刻的变革,记忆碎片化现象已从心理学概念渗透至日常工作和专业实践。对于软件测试从业者而言,这一现象不仅关乎个人效率,更对测试活动的严谨性、系统性和有效性构成了潜在威胁。…...

通过受管控的控制平面加速商品陈列优化

作者:来自 Elastic Alexander Marquardt, Honza Krl 及 Taylor Roy 搜索行为的变化不应该需要一个工程工单。了解受管控的控制平面如何让业务团队在数小时内更新搜索策略,而无需部署,也无需承担风险。 Elasticsearch 新手?参加我…...

05华夏之光永存・开源:黄大年茶思屋榜文解法「23期 5题」 【分布式收发机设计专项完整解法】

05华夏之光永存・开源:黄大年茶思屋榜文解法「23期 5题」 【分布式收发机设计专项完整解法】 一、摘要 分布式收发机设计与低秩/稀疏优化赛道,全球现代工程技术已触达绝对性能天花板。传统集中式均衡、单模块预编码、固定流量分配的技术框架,…...

429超过接口限频次数

总结场景推荐方案简单、快速集成手动重试工具类 Thread.sleep代码整洁,使用注解Spring Retry(但需额外处理 Retry-After)完全可控,需解析 Retry-After自定义 RetryTemplate 监听器想减少 429 发生加入 RateLimiter 主动限速 定…...

GLM-Image自动化测试:使用PyTest确保模型稳定性

GLM-Image自动化测试:使用PyTest确保模型稳定性 1. 引言 当你花费数小时训练出一个精美的GLM-Image模型,准备部署到生产环境时,最担心的是什么?是模型突然生成完全不符合描述的图像,还是在处理特定输入时直接崩溃&am…...

2026中小企业AI超级员工选型:5款工具实测指南

2026年,人工智能已从大型企业的专属技术配置,下沉为中小企业突破增长瓶颈、实现降本增效的核心驱动力。行业实测数据显示,完成AI超级员工系统部署的中小企业,平均获客成本降低60%,整体运营效率提升120%,而综…...

MusePublic Art Studio部署教程:国产昇腾910B芯片适配SDXL的可行性验证

MusePublic Art Studio部署教程:国产昇腾910B芯片适配SDXL的可行性验证 1. 项目概述 MusePublic Art Studio是一款专为艺术家和设计师打造的AI图像生成工具,它基于业界顶尖的Stable Diffusion XL(SDXL)架构,通过极简…...

【含最新安装包】小龙虾 AI OpenClaw v2.6.6 安装指南|办公自动化神器

Windows 一键部署 OpenClaw 教程|5 分钟搞定本地 AI 智能体,告别复杂配置【点击下载最新OpenClaw安装包】 2026 年开源圈备受关注的「数字员工」OpenClaw(昵称小龙虾),GitHub 星标突破 28 万 ,凭借本地运行…...

【稀缺首发】2024 Dev Containers兼容性矩阵图:Node.js 20/Python 3.12/Rust 1.78全版本支持状态+已验证镜像清单

更多请点击: https://intelliparadigm.com 第一章:Dev Containers兼容性矩阵图的权威发布与核心价值 Dev Containers(开发容器)正成为现代云原生开发工作流的关键基础设施。为统一生态标准、降低环境配置成本,OpenDev…...

艾体宝干货|【Redis实用技巧#17】语义缓存(Semantic Caching):LLM 的第一道防线

在大多数 AI 应用里,工程师第一反应通常是: “怎么优化模型调用?怎么选更便宜的模型?” 但一个更本质的问题是:为什么这么多请求本来就不该进模型? 这就是语义缓存的价值。 传统缓存为什么在 AI 时代失效…...

Rust 操作 Redis 从入门到生产级应用

Rust 操作 Redis 从入门到生产级应用 在现代后端开发中,Redis 作为高性能的内存数据库,广泛用于缓存、会话管理、消息队列等场景。本文将基于主流的 redis-rs 库,带你全面掌握 Rust 操作 Redis 的技巧,覆盖同步/异步双模式、连接…...

AI MV 高清无水印生成工具有哪些?零基础在线把歌曲做成 MV 的工具选择指南

AI MV 高清无水印生成工具主要有 OhYesAI、Revid、Kaiber、Runway、CapCut、HeyGen 和 Synthesia,区别在于是否能按歌曲风格、歌词故事、虚拟形象和手机端流程生成完整 MV。 AI MV 工具推荐速览表工具名核心能力(在线 AI MV 制作)适合人群免费…...

盘点全球十大海底光缆,数字孪生赋能资产展示

什么是海底光缆资产?海底光缆是全球通信的“水下黄金”,其资产体系包含了物理设施(光缆、中继器、分支单元、电馈器、登陆站)、容量资产(租用合同、服务等级协议)和维护资产(维修船、备件库&…...

# D3.js实战进阶:从基础图表到交互式数据仪表盘的全流程构建在现代前端开发中,**数据可视化已成为提升用户体验的核心能力之一

D3.js实战进阶:从基础图表到交互式数据仪表盘的全流程构建 在现代前端开发中,数据可视化已成为提升用户体验的核心能力之一。而 D3.js(Data-Driven Documents) 作为最灵活、功能最强的数据驱动文档库之一,正被越来越多…...

FlexASIO终极指南:如何为普通声卡免费获取专业级ASIO低延迟音频体验

FlexASIO终极指南:如何为普通声卡免费获取专业级ASIO低延迟音频体验 【免费下载链接】FlexASIO A flexible universal ASIO driver that uses the PortAudio sound I/O library. Supports WASAPI (shared and exclusive), KS, DirectSound and MME. 项目地址: htt…...

别再手写过滤器!Spring Cloud Gateway 内置 30+ 个,少写 80% 重复代码

别再手写过滤器!Spring Cloud Gateway 内置 30+ 个,少写 80% 重复代码 摘要:很多团队一做网关就习惯性手写过滤器,最后把简单问题做复杂,把配置问题做成代码问题。事实上,Spring Cloud Gateway 已经内置了 30+ 个 GatewayFilter Factory 与一组关键 GlobalFilter,覆盖路…...

PySide6安装踩坑实录:手把手解决‘DLL load failed’等常见错误(Win10/Win11通用)

PySide6安装踩坑实录:手把手解决‘DLL load failed’等常见错误(Win10/Win11通用) 最近在帮团队新人配置Python图形界面开发环境时,发现PySide6的安装过程远比想象中坎坷。特别是当看到终端弹出"DLL load failed while impor…...

别再死磕欧拉角了!用MATLAB的quaternion函数搞定机器人/无人机姿态解算(附完整代码)

四元数实战指南:用MATLAB彻底解决机器人姿态解算难题 刚接手无人机飞控项目时,我被欧拉角的万向节死锁问题折磨得焦头烂额——明明理论计算没问题,实际飞行时却总出现诡异的姿态跳变。直到改用四元数方案,这些问题才迎刃而解。本文…...

让微信小程序也能发PATCH

项目背景 在 uni-app TypeScript 开发微信小程序时,业务层大量使用了 RESTful 接口,其中更新操作用到了 PATCH。 然而小程序底层仅支持 GET/POST/PUT/DELETE…,不支持直接写 method: PATCH。 改动所有接口为 PUT 不仅语义不纯,还…...

DeepSeek-V4 新手快速上手指南

① 本地运行环境准备与依赖安装 在开始体验 DeepSeek-V4 之前,打造一个稳定且兼容的本地运行环境是至关重要的第一步。这不仅仅是安装几个软件包那么简单,更是为了确保后续推理过程流畅无阻。首先,你需要确保操作系统处于较新的版本&#xff…...

测试架构师养成记:技术深度与广度的平衡术

从“测试者”到“架构师”的跃迁在软件质量保障的星辰大海中,测试架构师正日益成为技术团队中不可或缺的航标。他们不再是单纯的功能验证者,而是质量体系的构建者、技术风险的洞察者和测试策略的规划师。对于广大软件测试从业者而言,成长为一…...

树莓派打造信息亭或工控面板?深度评测5款虚拟键盘(Matchbox/XVKBD等)的稳定性与定制化

树莓派虚拟键盘深度评测:Matchbox/XVKBD等5款方案在工业场景下的实战表现 当树莓派从极客玩具进化成工业级解决方案时,每个细节都关乎项目成败。去年为某连锁药店部署自助查询终端时,我们测试了市面上所有主流虚拟键盘方案,最终发…...

从效应思考一切

从效应思考一切一、参数是消息还是绑定对于一般的函数调用,有两种基本的思考方向。一种是将参数视为传递给函数的消息,函数作为一个接收消息并做出响应的实体。这类似于面向对象中的消息传递风格,或者像HTTP请求中参数作为请求体。这种思路强…...

LFM2.5-1.2B-Instruct实战指南:Gradio界面添加语音输入/输出扩展接口

LFM2.5-1.2B-Instruct实战指南:Gradio界面添加语音输入/输出扩展接口 1. 项目概述 LFM2.5-1.2B-Instruct是一个1.2B参数量的轻量级指令微调大语言模型,特别适合在边缘设备或低资源服务器上部署。这个模型可以用于构建嵌入式AI助手、轻量客服机器人等应…...

MySQL如何利用防火墙限制MySQL端口_使用iptables或安全组防御

应先放行本地回环(-A INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT),再拒绝外部访问(-A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -j DROP),并配合安全组与 bind-address 协同防护。iptables 怎么封…...

告别编译失败!保姆级教程:用CMake+VS2019/2022搞定Poco库(含32/64位配置)

从零到精通:Windows下用CMake与Visual Studio高效编译Poco库全攻略 第一次在Windows上编译Poco库的经历,相信很多C开发者都记忆犹新——那些令人抓狂的编译错误、晦涩难懂的CMake参数、版本不匹配的报错信息,足以让一个经验丰富的程序员也感到…...

安卓HAL C++基础-智能指针

一、原始指针的“定时炸弹”假设你写:HelloTest* p new HelloTest(); // 在堆上分配内存 p->getTestOne(...); delete p; // 必须手动释放问题:如果中间某段代码提前 return -1,delete 就被跳过了 → 内存泄漏。如果有多个地方保存了…...

基于 ESP32-S3 + VB6824 的四博 AI 双目交互终端设计:从双目动画到多模态事件系统

基于 ESP32-S3 VB6824 的四博 AI 双目交互终端设计:从双目动画到多模态事件系统 1. 项目背景 AI 硬件如果只停留在“语音问答”,用户体验会比较单薄。真正有产品感的 AI 终端,需要具备完整的多模态交互能力: 语音输入&#xf…...

AI 术语通俗词典:正则化

正则化是统计学、机器学习和人工智能中非常常见的一个术语。它用来描述一种控制模型复杂度的方法。换句话说,正则化是在回答:当模型已经有能力把训练数据拟合得很好时,怎样防止它学得过头,从而在新数据上表现变差。如果说模型训练…...