跨源资源共享(CORS)问题

时间:2013-12-31 14:58:58

标签: javascript jquery html5 cors sap

我们有一些Web服务返回xml + atom响应。它们托管在SAP NetWeaver Gateway应用程序服务器上。它们需要BASIC身份验证才能访问它们。响应包含以下标头以支持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中进行测试。我不确定缺少什么。任何有助于解决问题的建议都会很棒。

感谢。

1 个答案:

答案 0 :(得分:3)

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

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

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

同时确保服务器实际响应来自客户端的OPTIONS动词请求的那些标头。