7

我正在使用 html 数据类型进行跨域 ajax 请求。他们工作正常,因为我包括

Access-Control-Allow-Origin

在服务器的响应中。问题是我需要从服务器的响应中获取某些标头,无论我做什么,除了“内容类型”之外的响应标头都返回 null。

jQuery 执行请求,检索包括标头的响应(我可以从流量中看到它),但它不解析它。

我试过使用

crossDomain: true

它没有帮助。这是来自服务器的示例响应。

Access-Control-Allow-Origin:*
Cache-Control:private
Content-Encoding:gzip
Content-Length:514
Content-Type:text/html; charset=utf-8 
X-MYRESPONSEHEADER:1

如果请求和响应文档在同一台服务器上

 success: function (data, status, xhr) {
        totalRows = xhr.getResponseHeader("X-MYRESPONSEHEADER");

工作正常。我也尝试将 $.ajax 分配给像

var jQxhr = $.ajax(.....

我不明白为什么它不会被解析,因为 jQuery 实际上发出请求并得到响应

有任何想法吗?我错过了什么吗?

更新或龙的评论

发送到请求的标头

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-MYRESPONSEHEADER
Access-Control-Allow-Methods: POST
Access-Control-Allow-Methods: GET
X-MYRESPONSEHEADER: 24
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 29 Feb 2012 11:34:21 GMT

内容长度:514

4

4 回答 4

2

您需要在服务器响应中添加另一个 CORS 特定标头,Access-Control-Allow-Headers. 在这种情况下,

Access-Control-Allow-Headers: X-MYRESPONSEHEADER

参考:https ://developer.mozilla.org/en/http_access_control#Access-Control-Allow-Headers

于 2012-02-28T16:06:40.930 回答
2

如果您使用的是 aws s3(我认为这在其他情况下也适用),则问题可能是缺少 CORS 配置标签。我遇到了类似的失踪问题。这是我完成的配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://localhost:3000</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
        <ExposeHeader>*</ExposeHeader>
    </CORSRule>
</CORSConfiguration>

AllowedHeader 设置Access-Control-Request-Headers标头,ExposeHeader 设置Access-Control-Expose-Headers标头,否则浏览器将不允许 javascript 使用返回的标头。

于 2012-10-24T06:14:03.100 回答
2

要在服务器响应中读取除 content-type 以外的标头,服务器必须提供Access-Control-Expose-Headers,例如:

Access-Control-Expose-Headers: X-MYRESPONSEHEADER 

@dragon's answer提到Access-Control-Allow-Headers仅控制客户端在向服务器发出请求时可以发送哪些标头。

有用的 CORS 教程在这里:http ://www.html5rocks.com/en/tutorials/cors/

于 2016-03-15T06:54:15.970 回答
0

这是对我有用的配置。我已经把它放在 java Filter 过滤方法中。有些标头只需要通过预检请求发送(method = "OPTIONS"),不需要每次都发送。

请注意,对于“授权”标头,还需要“访问控制允许凭据”。

 HttpServletResponse resp = (HttpServletResponse) res;
 resp.addHeader("Access-Control-Allow-Origin", "http://your_domain:your_port");
 resp.addHeader("Access-Control-Allow-Credentials", "true");
 if (((HttpServletRequest) req).getMethod().equals("OPTIONS")) {
       resp.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
      resp.addHeader("Access-Control-Allow-Headers", "Authorization");
      return;
  }
于 2016-09-04T15:33:51.803 回答