【发布时间】:2018-10-01 22:56:01
【问题描述】:
我正在尝试使用此 jQuery 代码发出 Ajax CORS 请求
$.ajax({
url: "http://localhost:8080/itt_service/rest",
type: "POST",
contentType: "application/json;charset=utf-8",
data: pdata,
dataType: "text"
}).done(function(data){})
.always(function (a,data,b) {})
.fail(function (jqXHR, textStatus, errorThrown) {
alert("Failed: " + errorThrown);});
但是fail函数总是被执行,没有进一步的解释。 查看浏览器的网络部分,我可以看到首先有一个 OPTIONS 预检请求,如预期的那样。 请求头是:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:8080
Origin: http://localhost:8383
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0
响应头是:
HTTP/1.1 200 OK
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: POST
Access-Control-Allow-Origin: *
Content-Length: 0
Date: Sat, 21 Apr 2018 10:19:30 GMT
Server: GlassFish Server Open Source Edition 4.1
X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.1 Java/Oracle Corporation/1.8)
一切看起来都不错,而且肯定是这样,因为这个预检请求之后是实际的 POST 请求。现在的请求标头是
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
Content-Length: 79
Content-Type: application/json;charset=utf-8
Host: localhost:8080
Origin: http://localhost:8383
Referer: http://localhost:8383/itt_webclient/main.html
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0
响应头是
HTTP/1.1 200 OK
Content-Length: 27
Content-Type: application/json;charset=utf-8
Date: Sat, 21 Apr 2018 10:19:30 GMT
Server: GlassFish Server Open Source Edition 4.1
X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.1 Java/Oracle Corporation/1.8)
一切看起来又好了。我得到了 200 OK,我得到了正确的 Content-Length (27),我什至可以在浏览器的 Network 工具中看到响应正文:
{"results":{},"errors":[8]}
(不要介意正文的“错误”响应,这是预期的正确响应) 但是永远不会调用 done 处理程序。相反,失败处理程序总是用“textStatus”:“error”和“errorThrown”:“”调用。 CORS 部分对我来说看起来不错,我猜如果 cors 协商失败,第二个 POST 请求根本不会发生。我还可以通过将来自服务器的“Access-Control-Allow-Origin”响应更改为“错误”来检查这一点,这会导致没有预期的 POST 请求。 我想知道 JSON 响应是否格式不正确,所以我还将预期的响应类型(在客户端和服务器上)更改为“文本/纯文本”,但问题仍然存在。 我还尝试使用 XMLHttpRequest 而不是 jQuery 发出请求,结果相同。
你有什么想法吗? 谢谢
【问题讨论】:
-
服务器(Glassfish?)显然没有将 Access-Control-Allow-Origin 响应头添加到 POST 请求的响应中——它只是将它添加到 OPTIONS 请求的响应中。但是服务器也需要发送它来响应 POST 请求。即使浏览器获得了 POST 的响应并且您可以在 devtools 中看到该响应,浏览器也会阻止您的前端 JavaScript 代码访问响应,除非它包含 Access-Control-Allow-Origin 响应标头。
-
谢谢!这就是问题所在。我也将 Access-Control 标头添加到 POST 响应中,现在一切正常。