Javascript jQuery、CORS、JSON(无填充)和身份验证问题

Javascript jQuery、CORS、JSON(无填充)和身份验证问题,javascript,jquery,ajax,jsonp,cors,Javascript,Jquery,Ajax,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, accep

我有两个域名。我试图通过另一个域上的页面从一个域访问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"
从我的另一个域,我调用以下命令:

我知道“auth”已正确初始化(记录并检查)。然而,这是行不通的。在Firefox的控制台中,我得到 请求URL:

Request Method:
OPTIONS

Status Code:
HTTP/1.1 401 Authorization Required
如果在发送之前去掉
部分:…
我会看到以下内容

Request Method:
GET

Status Code:
HTTP/1.1 401 Authorization Required
Request Method:
GET

Status Code:
HTTP/1.1 200 OK
然而,服务JSON的域也可以服务于JSONP。我不想使用它,主要是因为应用程序将在专用浏览器上持续运行,我很担心。更重要的是,我真的很想知道我所做的到底有什么错。我知道,出于实际目的,有多种方法可以克服JSONP内存泄漏(例如不使用jQuery)

无论如何,当我使用JSONP时,我的代码如下所示:

$.ajax({
    url:newUrl,
    dataType:'jsonp',
    jsonp:'jsonp'
}).done(function(d){console.log(d)})
这将得到以下结果

Request Method:
GET

Status Code:
HTTP/1.1 401 Authorization Required
Request Method:
GET

Status Code:
HTTP/1.1 200 OK
之后,它会提示我输入用户名和密码的警告框

jQuery处理JSONP请求的方式与处理JSON请求的方式有根本区别吗?如果是这样,我该如何解决这个问题

谢谢

编辑:以下是我的发现

基本上,因为我需要身份验证,GET请求发送一个授权头。但是,这不是一个“简单”的标题,因此浏览器正在发送飞行前请求(选项)。不过,此飞行前请求没有任何身份验证,因此服务器拒绝了它。“解决方案”是将服务器设置为允许选项请求不需要身份验证,并向其报告HTTP状态200

参考:

邮件存档[.com]/c-user@axis.apache.org/msg00790.html(不允许发布更多链接)

不幸的是,“解决方案”只适用于Firefox,而不适用于Chrome。Chrome只是用红色显示请求,但没有给我更多关于失败原因的信息

编辑2:在Chrome上修复:我试图从中获取数据的服务器具有不受信任的安全证书。Chrome上的飞行前请求因此失败。解决方案
超级用户[.com]/questions/27268/how-do-i-disable-the-warning-chrome-gives-if-a-security-certificate-is-not-trust(不允许发布更多链接)

为什么不尝试在浏览器中键入获取JSON的URL,看看会发生什么。听起来你只需要通过这个网站的认证就可以访问它


如果您的站点需要在其他浏览器(如IE)中工作,顺便说一句,您将需要JSONP。安全机制不允许跨站点请求工作。标题不会改变这一点。我相信您还需要在标题中添加一个安全策略。

好的,现在我有足够的代表了,我不妨回答这个问题并接受它

当您尝试向带有标题的服务器发送
GET
json请求时,浏览器首先发送
选项
请求,以确保您可以访问它。不幸的是,此
选项
请求不能附带任何身份验证。这意味着,如果要使用auth发送
GET
,服务器必须允许不使用auth的选项。一旦我这样做了,事情就开始了。

可以进一步说明访问控制如何与CORS相结合。特别是那些有资格的人得到的例子。访问控制要求请求将
XMLHttpRequest
上的
withCredentials
标志设置为
true
,对于处理
选项的服务器
方法,需要做两件事:

  • 设置访问控制允许凭据:true
  • 不要在
    访问控制允许原点
    标题中使用通配符
    *
    。必须完全根据on HTTP访问控制(CORS)将其设置为源
  • 本质上,处理OPTIONS请求的东西需要发回相应的响应头,这样您就可以发出经过认证的请求

    在您的问题中,您表示您正在与之交互的服务正在返回
    访问控制允许来源:
    ,这与经认证的跨域请求不兼容。这需要具体返回原点


    上述MDN Http访问控制(CORS)文档还链接到服务器端访问控制文档,该文档概述了服务器可能如何响应各种跨域请求,包括处理跨域认证POST请求,该请求要求您返回正确的头以响应OPTIONS方法

    试过了。转到URL会弹出一个警报,询问用户名和密码,但是没有jsonp的get请求不会。我不需要IE的支持。不过,谢谢你的帮助。。。还有其他想法吗?我认为:jQuery JSONP将数据作为外部JavaScript加载(在
    中添加
    标记),并在加载后运行临时生成的jQuery函数来解析传入的
    数组。jQuery JSON将数据加载为一个XHR请求,该请求预期会产生一个JSON对象(因此它不会作为
    加载),当跨不同来源加载时,该对象将失败,并出现CORS错误,因此不会远到弹出用户/传递警报框的程度。我非常确定JSON加载会进行预取,如果跨域加载,则预取将失败。因此,您可能没有通过预取。可能是您将user:pasdwd编码到base64时出错了吗?@poverth:我想这是真正的原因。似乎如果加载了标记,服务器会询问我的用户名和密码,但如果是XHR请求,则不会。如果我发送凭证,JSON请求会进行预飞行,尽管服务器允许“选项”方法,但预飞行似乎失败了。现在,我必须保持机智