尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
前端面试官:Post为什么要发送两次请求?
核心思路浏览器出于安全考虑对“非简单请求”自动发起 OPTIONS 预检以获取服务器授权性能优化的本质是“将非简单请求降级为简单请求”或“缓存预检结果”。️ 解决方案架构图文本版[客户端 Browser] [网络层] [服务端 Server] | | | | 1. 判断是否为非简单请求? | | |--(是)-----------------------| | | | | | 2. 发送 OPTIONS 预检请求 | | | (Origin, Method, Headers) | -------------------------| | | | 3. 校验CORS策略 | | | | 4. 返回预检响应 | -------------------------| | (Access-Control-Allow-*) | | | | | | 5. 检查响应头是否包含允许信息 | | |--(通过)---------------------| | | | | | 6. 发送真正的业务请求(POST等) | | | ----------------------------| | | | | | 7. 返回业务数据 | -------------------------| | | | ⚠️ 若步骤5校验失败 - 浏览器直接拦截抛出CORS Error真实请求永不发出 答案核心干货1. 纠正概念不是“两次POST”而是“1次OPTIONS 1次POST”错误认知浏览器发了两次一样的请求。正确原理这是 CORS 机制中的Preflight预检。浏览器在发送跨域的非简单请求前必须先询问服务器“我即将用 X 方法、带 Y 头访问你你允许吗”主要矛盾安全性 vs 性能。预检保障了跨域安全但增加了一次 RTT往返时延导致接口耗时翻倍。次要矛盾开发者对“简单请求”定义模糊导致无意中触发了不必要的预检。2. 触发预检的条件非简单请求判定只要满足以下任意一条即触发 OPTIONSMethod 非简单不是GET、HEAD、POST注意即使是POST也可能触发见下条。Content-Type 非简单不是application/x-www-form-urlencoded、multipart/form-data、text/plain。⚠️高频坑点application/json会触发预检。自定义请求头携带了除 CORS 安全列表以外的 Header如Authorization、X-Token、X-Requested-With。其他使用了ReadableStream、XMLHttpRequestUpload对象注册了事件监听器等。❓ 为什么 GET 很少发预检POST 却经常发GET 通常是简单请求无Body、无自定义头。POST 在现代开发中常配合application/json或Authorization头使用这两者都会将其变为“非简单请求”。3. 优化策略从根源减少/消除预检优化手段原理适用场景局限性设置 Max-Age服务端返回Access-Control-Max-Age: 86400浏览器缓存预检结果所有跨域接口受浏览器上限限制Chrome 2h/Firefox 24h仅同域名路径有效降级 Content-Type改用text/plain或form-urlencoded内部服务、表单提交后端需适配解析逻辑不适合复杂嵌套JSON避免自定义头Token 放 CookieSameSiteNone或 URL 参数对SEO或旧系统兼容要求高安全性降低Cookie 有大小限制同域部署Nginx 反向代理/api到后端前端只访问同域生产环境首选需运维配置SSR/BFF架构天然支持WebSocketWS 不受 CORS 预检限制实时通信、长连接协议不同不适合常规CRUD⚠️ 边界场景与避坑指南Max-Age 的浏览器差异Chrome: 最大缓存2小时7200s超过按2h算。Firefox: 最大缓存24小时86400s。Safari: 历史上曾限制为5分钟新版本已改善但仍需注意。建议设置86400即可无需更大。预检请求不带 CookieOPTIONS 请求默认不携带凭证服务端校验时不能依赖 Cookie 中的 Session应基于 Origin/Header 做白名单校验。Vary如果服务端根据 Origin 动态返回 CORS 头必须在响应头加Vary: Origin否则 CDN/浏览器可能缓存错误的 CORS 响应给其他源。本地调试陷阱localhost和127.0.0.1被视为不同源开发时也会触发预检不要误以为是线上问题。 示例代码服务端Node.js/Koa正确配置app.use(async(ctx,next){constoriginctx.get(Origin);// ✅ 动态白名单校验constallowedOrigins[https://app.example.com,https://admin.example.com];if(allowedOrigins.includes(origin)){ctx.set(Access-Control-Allow-Origin,origin);ctx.set(Access-Control-Allow-Credentials,true);ctx.set(Access-Control-Allow-Methods,GET,POST,PUT,DELETE,OPTIONS);ctx.set(Access-Control-Allow-Headers,Content-Type,Authorization,X-Token);// ✅ 关键优化缓存预检结果24小时ctx.set(Access-Control-Max-Age,86400);// ✅ 关键安全防止CDN缓存污染ctx.set(Vary,Origin);}// ✅ OPTIONS 直接返回204不走后续业务逻辑if(ctx.methodOPTIONS){ctx.status204;return;}awaitnext();});前端规避预检的写法对比// ❌ 触发预检application/json Authorizationfetch(/api/data,{method:POST,headers:{Content-Type:application/json,Authorization:Bearer xxx},body:JSON.stringify({name:test})});// ✅ 不触发预检需后端支持解析fetch(/api/data,{method:POST,headers:{Content-Type:text/plain},body:JSON.stringify({name:test})// 字符串形式发送}); 满分答案面试口述版“这个问题考察的是对 CORS 预检机制的理解。首先澄清浏览器发的不是两次 POST而是一次 OPTIONS 预检 一次真实请求。这是浏览器对‘非简单请求’的安全握手确认服务器允许该跨域操作后才会发送真实请求。触发条件有三类一是方法不是 GET/HEAD/POST二是 Content-Type 不是表单/纯文本比如常用的 application/json三是带了 Authorization 等自定义头。这就是为什么 POST 比 GET 更容易触发预检——因为现代 API 普遍用 JSON 和 Token。优化方案分三层最有效生产环境通过 Nginx 反代实现同域彻底消除跨域最通用服务端设置Access-Control-Max-Age: 86400缓存预检结果注意 Chrome 上限是 2 小时兜底方案将 Content-Type 降级为 text/plain 或用 Cookie 替代自定义头把请求变回简单请求。额外注意服务端动态返回 CORS 头时必须加Vary: Origin否则 CDN 缓存会导致跨域混乱。这道题表面问网络现象实际考的是安全模型、HTTP 协议细节和工程化优化能力的综合理解。”
RELATED

相关推荐

医疗器械 UDI 与动力电池追溯:一物一码合规标签打印方案解析

医疗器械 UDI 与动力电池追溯:一物一码合规标签打印方案解析

引言一块动力电池从出厂到报废,可能要流转十几年;一支植入人体的医疗器械,直接关乎患者生命安全。这两类看似毫不相关的产品,如今被同一条规则串在了一起:每一件都必须有一个唯一的"身份证",并且…

📅 2026/10/7 16:45:48
Ornith-1.5: From Self-Scaffolding to Self-Improvement——从自我脚手架搭建到自我改进

Ornith-1.5: From Self-Scaffolding to Self-Improvement——从自我脚手架搭建到自我改进

一、核心贡献Ornith-1.5 提出了一种端到端的自我改进框架,让大语言模型能够通过持续自我生成任务、构建解决方案脚手架、产出训练数据,形成一个闭环的自我提升系统。这是 Ornith-1.0 自我脚手架搭建框架的重大升级。二、技术核心:三阶段自我改…

📅 2026/10/9 2:55:47
基于SpringBoot的智慧门诊预约与排队叫号系统(源码+文档+讲解视频)

基于SpringBoot的智慧门诊预约与排队叫号系统(源码+文档+讲解视频)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

📅 2026/10/6 14:31:42
MORE NEWS

更多资讯

📰

特种工复审要考试吗 值不值得考 2025年最新实操考试攻略

特种工复审要考试吗 值不值得考 2025年最新实操考试攻略 实操考试心里没底怕挂科,这是大多数特种工在面临复审时最真实的焦虑。特种工复审要考试吗?答案是肯定的。不同地区、不同工种的复审流程略有差异,但普遍都需要参加理论和实操考试。特别是在河…

📰

特种工复审要考试吗全国通用怎么处理更省事

特种工复审要考试吗全国通用怎么处理更省事 怕考不过白交培训费,特种工复审到底要不要考试?不少朋友在复审前就犯愁,怕自己记不住知识点,结果浪费钱又耽误工作。其实,特种作业操作证复审有没有考试,主要看你的证书类型和当地政策,但全国通用的证书在复…

📰

贺州初级电工证内部消息:电工证有效期多久?别等上岗再后悔

贺州初级电工证内部消息:电工证有效期多久?别等上岗再后悔 你是不是正为找工作发愁?听说工地、工厂、维修岗位都需要【贺州初级电工证】,可你手上还没拿到,一打听才知道, 没有这个证根本不能上岗 !别急,今天就给你透露个 内部消息…

📰

泸州电工证复审电话多久拿证?外省证能转过来吗?

泸州电工证复审电话多久拿证?外省证能转过来吗? 之前考的证在外省能不能转过来?这是很多电工朋友在复审或报考时最关心的问题。尤其是像在三门峡、郑州等地工作的电工,如果之前在别的省考的证,现在想在泸州复审,或者直接换证,流程到底是不是一样?多久…

📰

电工证能用几年啊?含金量高不高?别怕考不过白交钱,看完这篇全知道

电工证能用几年啊?含金量高不高?别怕考不过白交钱,看完这篇全知道 怕考不过白交培训费?现在考电工证还有用吗?别急,这篇文章直接告诉你电工证能用几年啊,含金量到底高不高,还有备考和报名的干货,看完你就知道值不值得花这笔钱。…

📰

涡阳电工证报名流程多少钱?工地太忙根本没时间复习考试

涡阳电工证报名流程多少钱?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是很多特种作业人员的共同烦恼。涡阳电工证报名流程虽然看似简单,但其中涉及到的手续、材料、考试和费用,都是很多人容易忽视的地方,特别是当工期紧、任务重的时候。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬