Access-Control-Allow-Origin:*不被Angular.js $ http识别

时间:2014-11-27 09:50:37

标签: javascript angularjs http

我正在开发一个javascript应用程序来控制一些智能电视,但角度预先点亮OPTIONS请求,然后尝试发送我要发送的POST请求(SOAP)。设备返回具有正确Access-Control-Allow-Origin: *的响应,但有角度拒绝发送POST请求。

当然,我无法更改设备服务器的配置以发送另一个标题为“需要”的标题,我需要发送CookieContent-Type

我该如何解决这个问题?


更新请求(底部)和响应(顶部)标题的屏幕截图。

enter image description here


使用相关的角度代码更新:

应用程序配置为:

app.config(['$httpProvider',function($httpProvider) {
    $httpProvider.defaults.withCredentials = true;
}])

请求是:

var body = '<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:X_SendIRCC xmlns:u="urn:schemas-sony-com:service:IRCC:1"><IRCCCode>{command}</IRCCCode></u:X_SendIRCC></s:Body></s:Envelope>';
var headers = {
    "Content-Type": "text/xml; charset=UTF-8",
    "SOAPACTION": "urn:schemas-sony-com:service:IRCC:1#X_SendIRCC"
};
return $http({
    method:"POST",
    url: "http://{ip}/sony/IRCC".replace("{ip}", config.ip),
    data: body.replace("{command}", signal),
    headers: headers
});

2 个答案:

答案 0 :(得分:1)

仅在您的浏览器不知道选项时才会获取选项, 因此,如果您事先可以从服务器(通常不是通过肥皂)加载某些内容,例如包含不可见的图像,那么您的浏览器应该已经知道这些选项而不是重新请求它们。

答案 1 :(得分:1)

我相信你的问题是withCredentials。使用withCredentials时,服务器必须表示允许凭据。在一个不需要预检的简单GET请求中,浏览器应该保留您应用中的任何此类响应;在预检请求中,它不应发送实际请求。

以下是mozilla https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials

的最佳说明

它说:

  

但浏览器将拒绝任何没有Access-Control-Allow-Credentials:true标头的响应,   并且不会将响应提供给调用的Web内容

如果您查看预检响应,则会看到标题:

Access-Control-Allow-Headers: "content-type,soapaction"
Access-Control-Allow-Origin: "*"

但所需的Access-Control-Allow-Credentials标题不存在。