预检请求由浏览器自动发起,开发者无法直接控制;关键在于前端避免触发条件(如用post模拟put、避免自定义头)和后端正确响应options请求,返回合法cors头(如access-control-allow-origin、methods、headers等),且状态码为204或200。

JavaScript 中使用 Ajax 处理跨域请求时,预检请求(Preflight Request)由浏览器自动发起,开发者无法直接发送或拦截它;你真正能控制的是主请求的配置,以及后端如何响应预检请求。关键不在于“在 JS 里处理预检响应”,而在于让预检顺利通过,使浏览器发出后续的实际请求。
理解预检触发条件
当 Ajax 请求满足以下任一条件时,浏览器会先发一个 OPTIONS 预检请求:
- 使用了除
GET、HEAD、POST以外的 HTTP 方法(如PUT、DELETE) - 设置了自定义请求头(如
Authorization、X-Request-ID) -
Content-Type不是以下三种之一:text/plain、multipart/form-data、application/x-www-form-urlencoded
前端 Ajax 配置要点(避免不必要的预检)
若想跳过预检,可调整请求方式:
- 用
POST模拟其他方法:服务端识别X-HTTP-Method-Override: PUT等头 - 避免自定义头,或改用标准头(如用
Authorization时,确保后端支持且已配置 CORS) - 传 JSON 时,保持
Content-Type: application/json—— 这一定会触发预检,无法绕过,必须靠后端配合
使用 fetch 示例(带凭证和 JSON):
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
fetch('https://api.example.com/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include', // 若需 Cookie,必须设此项
body: JSON.stringify({ id: 123 })
})
后端必须正确响应 OPTIONS 请求
这是预检通过的核心。浏览器发 OPTIONS 到目标 URL,后端需返回合法 CORS 响应头:
-
Access-Control-Allow-Origin:不能为*(若带凭证则必须指定确切域名) -
Access-Control-Allow-Methods:列出允许的方法,如GET, POST, PUT, DELETE -
Access-Control-Allow-Headers:列出允许的请求头,如Content-Type, Authorization -
Access-Control-Allow-Credentials:若前端设了credentials: 'include',此项必须为true -
Access-Control-Max-Age(可选):缓存预检结果时间(秒),减少重复 OPTIONS
注意:后端必须对 OPTIONS 请求返回 204 No Content 或 200,且不能有响应体。
调试预检失败的常见路径
打开浏览器开发者工具的 Network 面板,筛选 OPTIONS 请求:
- 若看不到
OPTIONS请求:说明没触发预检(检查请求是否满足上述条件) - 若
OPTIONS返回 4xx/5xx 或缺失关键 CORS 头:后端配置错误 - 若
OPTIONS成功但后续请求仍被拦:检查Access-Control-Allow-Origin是否与前端协议+域名完全匹配(含http://和端口) - 若提示 “Credentials not supported”:前后端
credentials和Access-Control-Allow-Credentials不一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










