我有一些工作JavaScript(在Firefox(v41)中运行),我需要修改它以支持跨域XMLHttpRequests(我的 POST
请求检索JSON编码数据) . 我控制了有问题的服务器,因此我捕获 OPTIONS
个请求并回复:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, X-Requested-With
Access-Control-Max-Age: 86400
浏览器然后正确发送 POST
请求,我的服务器响应数据并且数据返回到我的机器;我可以在Wireshark中看到它,它是格式良好的JSON .
但是,数据无法访问我的JavaScript . 我可以在Firefox窗口中看到对 POST
请求的响应确实到达,所有预期的 Headers 指示(例如)1120字节的内容,但是,当我单击"Response"选项卡时,其中没有任何内容: SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data
. 我的JavaScript代码最终出现在XMLHttpRequest的 onerror
函数中 .
我需要做什么才能正确获取数据?欢迎任何建议 .
以下是一个完整的HTTP交换示例,如浏览器计算机上的Wireshark所示:
OPTIONS /getAllData HTTP/1.1
Host: blah:blah
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: null
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.1 200 OK
Access-Control-Allow-Headers: Content-Type, X-Requested-With
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 86400
Date: Fri, 26 Aug 2016 09:22:14 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8
test
POST /getAllData HTTP/1.1
Host: blah:blah
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/string; charset=UTF-8
Content-Length: 4
Origin: null
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Date: Fri, 26 Aug 2016 09:22:15 GMT
Content-Length: 1121
{"wellformed":"data 1121 bytes long"}
1 回答
我玩过Access-Control-Allow-Origin,并且需要在发送给客户端的每个响应中实现头 .
因此,无论何时进行POST,答案都必须包含ACAO标头,否则浏览器会出于安全目的过滤掉内容 . 我没有看到你捕获的 Headers ,这可能解释了这个问题 .
您可以查看Mozilla中的示例,您将看到对POST的响应包括ACAO标头 .
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
此外,似乎您的正文内容未通过传统的空行(在HTTP协议中为\ r \ n)与 Headers 分隔 . 身体似乎是你的粘贴中 Headers 的一部分,但它可能只是你的复制粘贴的一个小故障 . 如果不是那么它也是一个潜在的解释:没有身体=没有内容 .
最后,我建议您通过BurpSuite等工具调试流量,这个工具实现了一个很好的代理,不仅可以实时查看和编辑您的请求,还可以重放它们并玩具 . 最初是一个安全工具,它仍然适用于调试Web应用程序 .
https://portswigger.net/burp/