JQuery,CORS和自定义响应头

时间:2013-07-10 21:20:16

标签: jquery cors

我有一个接受CORS请求的Web服务器。此服务器的所有响应都附加一个名为X-Server-Version的自定义标头。

此自定义标头列在CORS预检响应的Access-Control-Expose-Headers标头中(请参阅Cross Domain Resource Sharing GET: 'refused to get unsafe header "etag"' from Response)。使用ngrep我已经捕获了响应,如下所示。

  HTTP/1.1 200 OK..Server: Apache-Coyote/1.1..Access-Control-Allow-Headers: accept, origin, content-type..Access-Control-Allow-Origin: *..Access-Control-Expose-Headers: X-Server-Version..X-Server-Version: 1.0-SNAPSHOT..Access-Control-Allow-Methods: POST..Content-Length: 0..Date: Wed, 10 Jul 2013 21:05:58 GMT.... 

这是一个简单的Javascript应用程序,它调用启用CORS的端点。

<html>
    <head>
        <script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
        <script>
            $.ajax({
              type: "POST",
              url: "http://server",
              data: '{"value":"whatever"}',
              success: function(data, textStatus, jqXHR) {
                console.log(jqXHR.getAllResponseHeaders());
              },
              error: function (XMLHttpRequest, textStatus, errorThrown) {
                console.log(XMLHttpRequest.getAllResponseHeaders())
              },
              contentType:"application/json; charset=utf-8",
            });         
        </script>
    </head>
    <body>
    </body>
</html>

此调用是成功还是失败,getAllResponseHeaders()不会列出Chrome 28或Firefox 22的自定义标题.ngrep还确认标题存在于浏览器的响应中。

HTTP/1.1 200 OK..Server: Apache-Coyote/1.1..Access-Control-Allow-Origin: *..X-Server-Version: 1.0-SNAPSHOT..Content-Encoding: gzip..Content-Type: application/json..Content-Length: 7
  406..Date: Wed, 10 Jul 2013 21:09:11 GMT..

有没有人知道是否可以从jQuery ajax调用访问自定义标头?

1 个答案:

答案 0 :(得分:1)

这里的问题是需要在CORS响应中设置Access-Control-Expose-Headers标头,而不是预检(尽管如果出于某种原因你想在预检中读取自定义标头,你可以在预检中使用它)选项请求)。这个事实在我读过的任何文档中都没有特别清楚,所以我想我会在这里分享我的答案。

因此,ngrep捕获的响应看起来应该是

HTTP/1.1 400 Bad Request..Server: Apache-Coyote/1.1..Access-Control-Allow-Origin: *..Access-Control-Expose-Headers: X-Server-Version..X-Server-Version: 1.0-SNAPSHOT..Content-Enco
  ding: gzip..Content-Type: text/plain..Content-Length: 82..Date: Wed, 10 Jul 2013 23:03:37 GMT..

一旦返回该标题,访问客户标题就会按预期工作。