【问题标题】:JSONP isn't returning data in httpsJSONP 未在 https 中返回数据
【发布时间】:2013-04-30 04:14:08
【问题描述】:

我整个周五都花在这上面,我想我会在周一过来看看能不能得到一些帮助。总结如下:

我有两个网站,一个使用 AJAX 调用另一个网站上的 http 处理程序以获取令牌(字符串)。我最初使用的 json 调用效果很好,但是当我访问的网站使用 https 时,数据不会返回。

我收到 200 条成功消息,我使用 http 获取数据,但不是 https。我在本地机器上遇到了这个问题。我确认如果我使用相同的 URL,数据会在我的浏览器中返回。

另外,在 https 模式下,我设置了一个断点,看起来它甚至没有调用代码来传回令牌。

提前致谢!

         function onSuccessGetToken(token, url, type) {
         var getTokenUrl = url + "SSOtoken=" + token;

         //verify the URL is correct, for testing
         alert(getTokenUrl);

         $.ajax({
             url: getTokenUrl,
             contentType: "application/json; charset=utf-8",
             dataType: "json",
             success: function (msg) {
                 onSuccess(JSON.stringify(msg).replace(/\"/g, ""), url, type);
             },
             error: function (msg) {
                 //using jsonp, this always goes here, but no data is returned
                 alert(JSON.stringify(msg));
                 onErrorGetToken(msg);
             }
         });
     }

【问题讨论】:

  • JSONP 和 JSON 是两个完全不同的东西。你的问题标题谈到 JSONP,但我很确定你真的在谈论 JSON。

标签: asp.net json https jsonp


【解决方案1】:

您尚未显示 getTokenUrl 包含的内容,但根据您的问题描述,我想说您遇到了 Same Origin Policy,这会阻止不同“来源”之间的 ajax 调用。注意“来源”并不意味着“域”,不同的域是不同的来源,但不同的协议(httphttps)、不同的端口(例如808080)等也是如此。

在您的问题中,您谈到了 JSONP,但您没有使用 JSONP。您可以使用 JSONP 来处理跨域请求,这就是它的用途。为此,请使用 "jsonp" 作为您的 dataType,并确保您的服务器返回正确的 JSONP 响应(包括从查询字符串中获取 JSONP 回调的名称)。在the Wikipedia article on it 中了解有关 JSONP 的更多信息。

当您控制两个来源时进行跨域调用的另一种策略是使用Cross-Origin Resource Sharing。这是您的服务器响应浏览器发送的“预检”请求的地方,该请求告诉浏览器服务器是否会接受来自文档来源的调用。 Browser support 因为这些天在 IE 之外非常好。在 IE9 和更早版本中,它不是通过标准的 XMLHttpRequest 对象(这是 jQuery 使用的)来支持的。从 IE10 开始,他们终于做对了。


无关:您的ajax 调用,您指定contentType: "application/json"。这告诉服务器您发送 是 JSON,而不是告诉 jQuery 将 response 视为 JSON。那是另一个,dataType,您还指定了它(尽管使用正确配置的服务器,您不应该必须 - 服务器应该返回具有正确 MIME 类型的 Content-Type 标头)。

【讨论】:

  • getTokenUrl 工作正常,我发出警报并可以验证它是否在 http 或 https 模式下工作。您对同源策略的评论,我认为它与域有关,但您可能对端口是正确的,我将尝试在 https 模式下运行我的网站,看看是否有帮助。感谢您的回复。
  • 我只是在两个站点上都使用了 https 并且它可以工作。不敢相信我在这么简单的事情上浪费了整个星期五。感谢您的帮助!
  • @dave2118:不客气!很高兴这有帮助。是的,一些浏览器对 SOP 报告非常敏感。 FWIW,如果您使用的是 Chrome 并查看了开发人员工具,它会显示一条相当清晰的错误消息(如今,并非总是如此)。我不知道其他浏览器...
  • 我们内部使用的是 IE,所以我没有真正使用过 Chrome,因为它不是必需的,但谢谢你的提示。
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2018-01-16
  • 2017-01-01
  • 2012-01-31
  • 2014-05-26
相关资源
最近更新 更多