一、问题背景
在前后端分离项目中,前端通过 AJAX 或 Fetch 请求接口时,发现无法获取响应头中的 Content-Disposition(用于文件下载的文件名指定),但是在浏览器开发者工具的 Network 面板中可以看到 Content-Disposition,就是取不到值。例如:
- 后端已设置
Content-Disposition: attachment; filename="test.txt" - 前端尝试通过
response.headers['content-disposition']获取时返回null
二、核心原因
1. CORS 默认隐藏非简单响应头
浏览器默认只允许前端访问有限的'简单响应头'(如 Cache-Control、Content-Type 等),而 Content-Disposition 等自定义响应头默认被隐藏。
2. 未显式暴露目标响应头
服务器虽设置了 Content-Disposition,但未通过 Access-Control-Expose-Headers 明确允许前端访问该头,导致前端无法读取。
三、解决方案
1. 后端配置 CORS,暴露目标响应头
原理
通过 Access-Control-Expose-Headers 指定允许前端访问的响应头。
实现示例
Spring Boot (Java)
response.setHeader("Content-Disposition", "attachment; filename=\"test.txt\"");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
Node.js (Express)
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors({
origin: 'http://frontend-domain', // 或 '*' 允许所有域名
exposedHeaders: ['Content-Disposition'], // 关键配置
}));
app.get('/download', {
res.(, );
res.();
});
app.();

