【问题标题】:jQuery cross domain request response headersjQuery跨域请求响应头
【发布时间】:2012-03-18 03:01:18
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: jquery ajax cross-domain response-headers


    【解决方案1】:

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

    请注意,对于“Authorization”标头,“Access-Control-Allow-Credentials”也是必需的。

     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;
      }
    

    【讨论】:

      【解决方案2】:

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

      Access-Control-Expose-Headers: X-MYRESPONSEHEADER 
      

      @dragon 的回答提到了Access-Control-Allow-Headers,它只控制客户端在向服务器发出请求时可以发送哪些标头。

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

      【讨论】:

        【解决方案3】:

        如果您使用的是 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 使用返回的标头。

        【讨论】:

        • S3 给出错误:ExposeHeader "*" 包含通配符。我们目前不支持 ExposeHeader 的通配符。
        • 同样的问题——不能使用通配符。在我的情况下,虽然我只需要浏览器公开 Location 标头,并且此答案与明确定义的标头一起使用。
        【解决方案4】:

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

        Access-Control-Allow-Headers: X-MYRESPONSEHEADER
        

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

        【讨论】:

        • 它对我不起作用。你认为我需要将 $.ajax 分配给变量吗?
        • 您的HTTP OPTIONS request 是否返回了适当的访问控制标头?
        • @nLL 您能否为发出的两个请求中的每一个添加完整的请求/响应标头?第一个请求是 OPTIONS,第二个是 GET/POST。
        • 我没有手动执行任何 OPTIONS 请求,也没有看到 jQuery 这样做。它是过程的一部分吗?如果是这样,jQuery 怎么知道它
        • 这是该过程的一部分,浏览器在某些情况下会根据规范在进行跨域调用之前执行此操作。请注意,jQuery 不会进行此调用——浏览器会这样做。更多信息,developer.mozilla.org/en/…
        猜你喜欢
        • 1970-01-01
        • 2016-08-05
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 2013-03-11
        • 2011-07-05
        • 1970-01-01
        相关资源
        最近更新 更多