我有两个域名.我正在尝试通过另一个域中的页面从一个域访问JSON对象.我已经阅读了关于这个问题我能找到的所有内容,但仍然无法解决这个问题.
为JSON提供服务的域具有以下设置:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, OPTIONS"
Header set Access-Control-Allow-Headers "origin, authorization, accept"
从我的其他域名,我打电话给以下:
$.ajax({
type:'get',
beforeSend: function(xhr) {
var auth = // authentication;
xhr.setRequestHeader("Authorization", "Basic " + auth);
}
url:myUrl,
dataType:'json',
error: function(xhr, textStatus, errorThrown) { console.log(textStatus, errorThrown); }
})
我知道’auth’已正确初始化(记录和检查).但是,这不起作用.在Firefox的控制台中,我得到了
请求网址:…
Request Method:
OPTIONS
Status Code:
HTTP/1.1 401 Authorization required
如果我摆脱beforeSend:…部分,我会看到以下内容
Request Method:
GET
Status Code:
HTTP/1.1 401 Authorization required
但是,提供JSON的域也可以提供JSONP.我不想使用它,主要是因为应用程序将在专用浏览器上不断运行,我担心this issue.更重要的是,我真的想知道我在做什么实际上是错的.我知道出于实际目的,有各种方法可以克服JSONP内存泄漏(例如不使用jQuery).
无论如何,当我使用JSONP时,我的代码看起来像这样:
$.ajax({
url:newUrl,
dataType:'jsonp',
jsonp:'jsonp'
}).done(function(d){console.log(d)})
这得到以下内容
Request Method:
GET
Status Code:
HTTP/1.1 200 OK
与JSON请求相比,jQuery处理JSONP请求的方式有根本区别吗?如果是这样,我该如何解决这个问题呢?
谢谢.
编辑:这是我找到的.
基本上,因为我需要身份验证,GET请求正在发送Authorization标头.但是,这不是一个“简单”的标题,因此浏览器正在发送一个飞行前请求(OPTIONS).但是,此预检请求没有任何身份验证,因此服务器拒绝了它. “解决方案”是将服务器设置为让OPTIONS请求不需要身份验证,并向其报告HTTP状态200.
参考:http://www.kinvey.com/blog/item/61-kinvey-adds-cross-origin-resource-sharing-cors
mail-archive [.com] /[email protected]/msg00790.html(不允许发布更多链接)
不幸的是,“解决方案”仅适用于Firefox,而不适用于Chrome. Chrome只是以红色显示请求,但不会再向我提供有关失败原因的信息.
编辑2:在Chrome上修复:我尝试从中获取数据的服务器有一个不受信任的安全证书. Chrome上的预检请求因此而失败.解
超级用户[.com] / questions / 27268 / how-do-i-disable-the-warning-chrome-give-if-a-security-certificate-is-not-trust(不允许发布更多链接)
解决方法:
Welp,既然我已经有足够的代表了一段时间,我不妨回答这个问题并接受它.
当您尝试向带有标头的服务器发送GET json请求时,浏览器首先发送OPTION请求以确保您可以访问它.不幸的是,这个OPTION请求不能随身携带任何身份验证.这意味着如果要使用auth发送GET,服务器必须允许没有auth的OPTION.一旦我这样做,事情就开始起作用了.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。