如何强制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--
答案 0 :(得分:4)
出于安全原因,您无法强制XMLHttpRequest.setRequestHeader()
方法添加Expect
标头,因为您可以阅读W3C XMLHttpRequest specification:
setRequestHeader(header,value)方法必须运行以下步骤:
- 如果状态未打开,则抛出“InvalidStateError”异常并终止这些步骤。
- 如果设置了send()标志,则抛出“InvalidStateError”异常并终止这些步骤。
- 如果标题与字段名称生成不匹配,则抛出“SyntaxError”异常并终止这些步骤。
- 如果value与字段值生成不匹配,则抛出“SyntaxError”异常并终止这些步骤(注意:空字符串是合法的,表示空标题值)。
- 醇>
如果header是以下标题之一的不区分大小写的匹配项,请终止这些步骤:
- 接收字符集
- 接受编码
- 访问控制请求报头
- 访问控制请求-方法
- 连接内容长度
- Cookie
- COOKIE2
- 块引用
- 日期
- DNT
- 期待
- 主持人
- Keep-Alive Origin
- Referer
- TE
- 拖车
- 转移编码
- 升级
- 用户代理
- 通过
...或者如果标头的开头是Proxy-或Sec-的不区分大小写的匹配(包括标题只是代理或秒 - )。
上述标题由用户代理控制,以便控制传输的这些方面。这在一定程度上保证了数据完整性。不允许将以Sec-开头的标题名称设置为允许创建新的标题,这些标题保证不会来自XMLHttpRequest。
作为进一步的参考:
某些浏览器(例如Chrome)也会在“JavaScript控制台”中显示错误: