【问题标题】:Expect: 100-Continue header with XmlHTTPRequest期望:100-Continue 带有 XmlHTTPRequest 的标头
【发布时间】:2013-08-04 11:00:42
【问题描述】:

如何强制 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 Dump 输出片段

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--

【问题讨论】:

    标签: ajax xmlhttprequest http-1.1


    【解决方案1】:

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

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

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

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

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

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

    作为进一步参考:

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

    【讨论】:

    • 我知道。这意味着没有办法在浏览器中利用这个有用的功能。而你的回答正好印证了我的想法。
    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多