Ach*_*ave 4 javascript ajax jquery jsonp cors
我有两个域。我正在尝试通过另一个域上的页面从一个域访问 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"
Run Code Online (Sandbox Code Playgroud)
从我的其他域,我调用以下内容:
$.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); }
})
Run Code Online (Sandbox Code Playgroud)
我知道“auth”已正确初始化(记录并检查)。然而,这是行不通的。在 Firefox 的控制台中,我得到请求 URL:...
Request Method:
OPTIONS
Status Code:
HTTP/1.1 401 Authorization Required
Run Code Online (Sandbox Code Playgroud)
如果我去掉该beforeSend:...
部分,我会看到以下内容
Request Method:
GET
Status Code:
HTTP/1.1 401 Authorization Required
Run Code Online (Sandbox Code Playgroud)
但是,服务 JSON 的域也可以服务 JSONP。我不想使用这个,主要是因为应用程序将在专用浏览器上不断运行,我担心这个问题。更重要的是,我真的很想知道我所做的事情到底出了什么问题。我知道出于实际目的,有多种方法可以克服 JSONP 内存泄漏(例如不使用 jQuery)。
无论如何,当我使用 JSONP 时,我的代码如下所示:
$.ajax({
url:newUrl,
dataType:'jsonp',
jsonp:'jsonp'
}).done(function(d){console.log(d)})
Run Code Online (Sandbox Code Playgroud)
这得到以下结果
Request Method:
GET
Status Code:
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)
之后它会提示我输入用户名和密码的警告框。
jQuery 处理 JSONP 请求的方式与处理 JSON 请求的方式有根本区别吗?如果是这样,我该如何解决这个问题?
谢谢。
编辑:这就是我发现的。
基本上,因为我需要身份验证,所以 GET 请求发送一个授权标头。但是,这不是一个“简单”标头,因此浏览器正在发送飞行前请求(选项)。不过,此预检请求没有任何身份验证,因此服务器拒绝了它。“解决方案”是将服务器设置为让 OPTIONS 请求不需要身份验证,并向其报告 HTTP 状态 200。
参考:http ://www.kinvey.com/blog/item/61-kinvey-adds-cross-origin-resource-sharing-cors
mail-archive[.com]/c-user@axis.apache.org/msg00790.html(不允许发布更多链接)
不幸的是,该“解决方案”仅适用于 Firefox,不适用于 Chrome。Chrome 仅将请求显示为红色,但没有提供有关失败原因的更多信息。
编辑 2:在 Chrome 上修复:我尝试从中获取数据的服务器有一个不受信任的安全证书。Chrome 上的预检请求因此失败。解决方案 superuser[.com]/questions/27268/how-do-i-disable-the-warning-chrome-gives-if-a-security-certificate-is-not-trust (不允许发布更多链接)
好吧,既然我稍后有足够的代表,我不妨回答这个问题并接受它。
当您尝试向带有标头的服务器发送GET
json 请求时,浏览器首先发送请求OPTION
以确保您可以访问它。不幸的是,这个OPTION
请求不能携带任何身份验证。这意味着如果您想发送GET
带有身份验证的选项,服务器必须允许不带身份验证的选项。一旦我这样做了,事情就开始起作用了。
归档时间: |
|
查看次数: |
10095 次 |
最近记录: |