XMLHttpRequest 设置请求头必须在 open() 之后、send() 之前调用 setRequestHeader();浏览器自动设置 Content-Length 等头,不可覆盖;带 Cookie 需设 withCredentials = true 且服务端配合 CORS 配置。

在 JavaScript 中,通过 XMLHttpRequest 设置请求头参数,必须在调用 open() 之后、send() 之前使用 setRequestHeader() 方法。否则会报错(例如“InvalidStateError”)。
正确设置请求头的顺序
这是关键前提:请求头只能在请求已打开但尚未发送时设置。
- 先调用
xhr.open(method, url) - 再调用
xhr.setRequestHeader(headerName, headerValue)(可多次) - 最后调用
xhr.send(data)
常见请求头设置示例
比如发送 JSON 数据、带身份认证或自定义标识:
const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/users');
// 设置 Content-Type(重要:告诉后端你发的是 JSON)
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
// 设置认证 token
xhr.setRequestHeader('Authorization', 'Bearer abc123xyz');
// 设置自定义请求头(需服务端允许跨域时配置 Access-Control-Allow-Headers)
xhr.setRequestHeader('X-Client-Version', '2.1.0');
xhr.send(JSON.stringify({ name: 'Alice', age: 30 }));
注意自动设置与禁止覆盖的请求头
浏览器会自动设置部分请求头(如 Content-Length、Connection),你不能手动覆盖它们;强行调用 setRequestHeader() 会静默失败或抛异常。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
以下请求头通常被限制(取决于浏览器和 CORS 状态):
Accept-CharsetAccept-EncodingAccess-Control-Request-HeadersAccess-Control-Request-MethodConnection-
Content-Length(当使用send(body)且 body 非 null 时由浏览器自动计算)
结合 withCredentials 处理带 Cookie 的请求
如果需要携带 Cookie 或认证凭据(如 session),除了设置请求头,还需启用凭证支持:
xhr.open('GET', '/api/profile');
xhr.withCredentials = true; // 必须在 open() 后、send() 前设置
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send();
注意:服务端也必须响应 Access-Control-Allow-Credentials: true,且 Access-Control-Allow-Origin 不能为通配符 *。

















