【问题标题】:Error in CORS Ajax request although CORS headers are ok and I get the POST responseCORS Ajax 请求中的错误,尽管 CORS 标头正常并且我收到 POST 响应
【发布时间】: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 响应中,现在一切正常。

标签: ajax cors


【解决方案1】:

您可以尝试删除dataType 或尝试将其更改为http://api.jquery.com/jquery.ajax/ 此处给出的其他一些选项(可能是jsonp)

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 2020-10-01
    • 2015-11-13
    • 2020-07-09
    • 2022-01-21
    • 2021-06-01
    • 2021-08-17
    • 2015-05-02
    相关资源
    最近更新 更多