必须由后端在 access-control-expose-headers 中显式声明自定义 header(如 x-request-id),fetch 才能通过 response.headers.get() 读取;注意大小写规范与拼写一致,调试时需检查 network 面板确认响应头存在且暴露配置正确。

fetch 默认无法读取响应中的自定义 Header(比如 X-Request-ID、X-Total-Count),除非后端明确在 Access-Control-Expose-Headers 响应头中声明这些字段。
后端必须暴露自定义 Header
这是关键前提。浏览器出于安全限制,只允许 JavaScript 读取部分“简单响应头”(如 Cache-Control、Content-Type、Expires 等)。其他自定义 Header 必须由服务端显式透出:
- Spring Boot 示例(Java):
response.setHeader("Access-Control-Expose-Headers", "X-Request-ID, X-Total-Count"); - Express.js(Node.js):
res.header('Access-Control-Expose-Headers', 'X-Request-ID, X-Total-Count'); - Nginx 配置:
add_header 'Access-Control-Expose-Headers' 'X-Request-ID, X-Total-Count';
前端用 response.headers.get() 读取
暴露后,fetch 响应的 headers 对象才支持获取对应字段:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
fetch('/api/data')
.then(res => {
// ✅ 可以读取(前提是后端已暴露)
const requestId = res.headers.get('X-Request-ID');
const totalCount = res.headers.get('X-Total-Count');
// ❌ 如果没暴露,这里返回 null
console.log(requestId, totalCount); // 如:'abc123', '42'
return res.json();
});
注意大小写和空格问题
HTTP Header 名称不区分大小写,但 get() 方法对拼写敏感(推荐全大写+连字符风格):
- ✅ 正确写法:
res.headers.get('X-Request-ID')、res.headers.get('Content-Type') - ⚠️ 避免写成:
'x-request-id'或'X_Request_ID'(虽可能兼容,但不规范) - ⚠️ 注意不要多加空格:
'X-Request-ID '会返回null
调试技巧:检查 Network 面板
如果拿不到自定义 Header,先打开浏览器开发者工具 → Network → 点击请求 → 查看 Response Headers 标签页:
- 确认目标 Header 是否真实存在(如
X-Request-ID: abc123) - 确认
Access-Control-Expose-Headers值是否包含该字段,且拼写完全一致 - 若该字段根本没出现在响应头里,说明是后端逻辑未设置,而非跨域问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










