优化预检请求缓存需合理设置Access-Control-Max-Age响应头,开发环境建议60–300秒,测试环境3600秒,生产环境86400–604800秒,并配合前端减少自定义请求头、规范Content-Type及统一请求模式。

预检请求(OPTIONS)本身不传输业务数据,但频繁触发会增加网络开销和延迟。优化它的缓存时间,核心是合理设置 Access-Control-Max-Age 响应头,让浏览器在有效期内复用预检结果,避免重复发 OPTIONS。
理解 Access-Control-Max-Age 的作用
这个响应头告诉浏览器:本次预检检查的结果可以缓存多久(单位为秒)。缓存期间,相同 URL、方法、请求头组合的后续请求,将跳过预检,直接发送正式请求。
例如设为 Access-Control-Max-Age: 86400(24 小时),意味着一天内对同一接口的同类跨域请求,只在第一次触发预检。
设置合理的缓存时长
太短(如 60 秒)会导致频繁预检;太长(如 1 年)则可能掩盖服务端 CORS 策略变更,带来兼容或安全风险。推荐按场景选择:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 开发环境:设为 60–300 秒,便于快速验证策略调整
- 测试/预发布环境:设为 3600 秒(1 小时),平衡稳定性和灵活性
- 生产环境:设为 86400(24 小时)或最多 604800(7 天),兼顾性能与可控性
服务端配置示例(以 Express 为例)
确保 OPTIONS 响应中包含该头部,且与其他 CORS 头一致:
app.options('/api/*', (req, res) => {
res.header('Access-Control-Allow-Origin', 'https://your-frontend.com');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, X-Token, Authorization');
res.header('Access-Control-Allow-Credentials', 'true');
res.header('Access-Control-Max-Age', '86400'); // 关键:设置缓存时间为 24 小时
res.sendStatus(204);
});
注意:若使用 CORS 中间件(如 cors npm 包),可直接传入 maxAge 选项:
const cors = require('cors');
app.use(cors({
origin: 'https://your-frontend.com',
credentials: true,
maxAge: 86400 // 自动注入 Access-Control-Max-Age
}));
配合前端减少预检触发频率
缓存只是优化手段之一。真正降低预检压力,还需从前端请求设计入手:
- 避免不必要的自定义请求头(如用 query 参数替代
X-Request-ID) - 优先用 POST 替代 PUT/DELETE(若后端支持),因后者必触发预检
- Content-Type 尽量用
application/x-www-form-urlencoded或text/plain,而非application/json(除非必须) - 对高频调用的接口,确保其请求模式(URL + method + headers)尽量统一,利于缓存命中

















