跨域资源共享 (CORS) 问题

Posted

技术标签:

【中文标题】跨域资源共享 (CORS) 问题【英文标题】:Cross Origin Resource Sharing (CORS) issue 【发布时间】:2014-01-18 11:51:50 【问题描述】:

我们有一些 Web 服务返回 xml+atom 响应。这些托管在 SAP NetWeaver Gateway 应用服务器上。它们需要基本身份验证才能访问它们。响应包含以下标头以支持 CORS:

access-control-allow-origin: *
access-control-allow-methods: POST, GET, OPTIONS, PUT, DELETE, HEAD
access-control-allow-headers: Content-Type
access-control-max-age: 1728000

我们有一个 html5 应用程序,它使用 jquery 来调用服务,如下所示:

var url = "http://mytesturl.com/test/";
    $.ajax(
        url: url,
        async: true,
        contentType:"application/atom+xml", 
        type: "GET",
        crossdomain: true,
        beforeSend: function (xhr) 
        xhr.setRequestHeader('Authorization', make_base_auth(uname, passwd));
        
    )
            .done(function( data, textStatus, jqXHR )alert("success");)
       .fail(function( jqXHR, textStatus, errorThrown )
            console.log(jqXHR.status);
            alert(errorThrown + jqXHR.status);
        ); 

尽管服务器响应中包含标头,但我们继续收到如下 CORS 错误:

Failed to load resource: the server responded with a status of 401 (Unauthorized)
Failed to load resource: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8383' is therefore not allowed access.

用户名 (uname) 和密码 (passwd) 正确。如果我尝试使用 RestClient 之类的工具调用服务,我可以在响应中看到标头。我曾尝试在 Chrome 31.0 版和 Safari 6.0.5 版中进行测试。我不确定缺少什么。任何有助于解决问题的建议都会很棒。

谢谢。

【问题讨论】:

contentType 选项设置请求正文Content-type标头,不是响应正文。我没有看到您发送任何数据,因此该选项不正确。 值得一看 - ***.com/questions/16689496/… 这个问题可能与401 错误有关。 Access-Control-Allow-Origin 可能仅在服务器以200 OK 响应时发送,而不是401 Unauthorized 我们添加了这个 401 并添加了标题作为下面的答案。发布这个,当客户端发出一个 HTTP GET 请求时,我可以看到一个 HTTP OPTIONS 调用发生。 OPTIONS 调用返回状态 204 无数据,并且响应中不包含访问控制标头。 GET 调用永远不会发生。有什么想法可以解决这个问题吗? 【参考方案1】:

您似乎忘记在允许的标头列表中包含 Authorization 标头:

access-control-allow-headers: Content-Type, Authorization

您的客户端代码正在发送 Authorization 标头(基本身份验证内容),因此服务器必须在 CORS 级别明确允许此操作。

还要确保服务器实际上正在响应来自客户端的 OPTIONS 动词请求的这些标头。

【讨论】:

我们添加了这个标题。发布这个,当客户端发出一个 HTTP GET 请求时,我可以看到一个 HTTP OPTIONS 调用发生。 OPTIONS 调用返回状态 204 无数据,并且响应中不包含访问控制标头。 GET 调用永远不会发生。有什么想法可以解决这个问题吗?

以上是关于跨域资源共享 (CORS) 问题的主要内容,如果未能解决你的问题,请参考以下文章

跨域资源共享 (CORS) 概念

AJAX入门

Amazon S3 CORS(跨域资源共享)和 Firefox 跨域字体加载

同源策略和CORS(跨域资源共享)

跨域资源共享 (CORS) - 我在这里遗漏了啥吗?

跨域资源共享 - CORS