我有一些工作的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
请求的响应到达,所有预期的标题指示(例如)1120字节的内容但是,当我点击&时#34;响应"标签,其中没有任何内容: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"}
答案 0 :(得分:0)
我玩过Access-Control-Allow-Origin,并且需要在发送给客户端的每个响应中实现标头。
因此,无论何时进行POST,答案都必须包含ACAO标头,否则浏览器会出于安全目的过滤掉内容。我没有看到你捕获的标题,这可能解释了这个问题。
您可以查看Mozilla中的示例,您将看到对POST的响应确实包含ACAO标题。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
此外,您的正文内容似乎没有通过传统的空行(在HTTP协议中为\ r \ n)与标题分隔。身体似乎是你的粘贴中的标题的一部分,但它可能只是你的复制粘贴的故障。如果不是,那么它也是一个可能的解释:没有身体=没有内容。
最后,我建议您通过BurpSuite等工具调试您的流量,这个工具实现了一个很好的代理,不仅可以实时查看和编辑您的请求,还可以重放它们并玩具。最初是一个安全工具,它仍然适用于调试Web应用程序。