2

如何强制 XmlHttpRequest 添加 Expect: 100-continue 标头?如何在桌面浏览器世界中使用此功能?

var xmlhttp = new XMLHttpRequest();
var dataToSend = new FormData();
dataToSend.append('some', 'data');
dataToSend.append('token', 'secret-token');

xmlhttp.open("POST", "/post", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Expect", "100-continue");
xmlhttp.setRequestHeader("Custom-Header", "This is custom data");
xmlhttp.send(dataToSend);

这是 TCP 转储输出部分

POST /post HTTP/1.1
Host: 127.0.0.1:3000
Connection: keep-alive
Content-Length: 243
Origin: http://127.0.0.1:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Custom-Header: This is custom data
Content-type: application/x-www-form-urlencoded
Accept: */*
Referer: http://127.0.0.1:3000/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: connect.sid=s%3AAKgYIit0sVHMcI7na85UR_Na.o7uSDBEidLEyQ3cTaGyXlMrPiF3vADrwpnCrkCrJBD0

------WebKitFormBoundary9agFn5mlxh7SUBf7
Content-Disposition: form-data; name="some"

data
------WebKitFormBoundary9agFn5mlxh7SUBf7
Content-Disposition: form-data; name="token"

secret-token
------WebKitFormBoundary9agFn5mlxh7SUBf7--
4

1 回答 1

4

出于安全原因,您不能强制该XMLHttpRequest.setRequestHeader()方法添加Expect标头,您可以在W3C XMLHttpRequest 规范中阅读:

setRequestHeader(header, value) 方法必须运行以下步骤:

  1. 如果状态不是 OPENED,则抛出“InvalidStateError”异常并终止这些步骤。
  2. 如果设置了 send() 标志,则抛出“InvalidStateError”异常并终止这些步骤。
  3. 如果标头与字段名称生产不匹配,则抛出“SyntaxError”异常并终止这些步骤。
  4. 如果 value 与 field-value 产生不匹配,则抛出“SyntaxError”异常并终止这些步骤(注意:空字符串是合法的,表示空头值)。
  5. 如果标头与以下标头之一不区分大小写,则终止这些步骤:

    • 接受字符集
    • 接受编码
    • 访问控制请求标头
    • 访问控制请求方法
    • 连接内容长度
    • 曲奇饼
    • 饼干2
    • 块引用
    • 日期
    • DNT
    • 预计
    • 主持人
    • 保活起源
    • 推荐人
    • TE
    • 预告片
    • 传输编码
    • 升级
    • 用户代理
    • 通过

...或者如果标头的开头是 Proxy- 或 Sec- 不区分大小写的匹配项(包括标头只是 Proxy- 或 Sec- 时)。

上述标头由用户代理控制,以使其控制传输的这些方面。这在一定程度上保证了数据的完整性。不允许设置以 Sec- 开头的标头名称以允许生成新标头,这些标头保证不会来自 XMLHttpRequest。

作为进一步的参考:

某些浏览器(例如 Chrome)也会在其“JavaScript 控制台”中显示错误:

不安全的标头

于 2013-08-11T20:08:04.813 回答