2013-05-06 43 views
0

中的数据我花了整个周五的时间,并且认为我会在星期一进来看看我能否得到一些帮助。这里有一个总结:JSONP没有返回https

我有两个网站,一个使用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); 
      } 
     }); 
    } 
+0

JSONP和JSON是两个完全不同的东西。你的问题标题是关于JSONP的,但我确定你真的在谈论JSON。 – 2013-05-06 11:55:26

回答

1

您还没有表现出什么getTokenUrl含有,但是从你的问题描述我说你正在运行到Same Origin Policy,防止不同之间的Ajax调用“的起源。”注意“出身”并不意味着“域”,不同的领域是不同的起源,而且还有不同的协议(httphttps),不同的端口(808080例如)等

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

当您同时控制两个来源时执行跨来源呼叫的另一种策略是使用Cross-Origin Resource Sharing。这是您的服务器响应浏览器发送的“预检”请求的地方,它告诉浏览器服务器是否接受来自文档原点的调用。因为它在IE以外的这些日子里都很不错。在IE9和更早版本中,它不受标准的XMLHttpRequest对象(这是jQuery使用的)支持。截至IE10,他们终于明白了。


无关:您的通话ajax,你指定contentType: "application/json"。这是告诉服务器,你是发送是JSON,而不是告诉jQuery将响应视为JSON。这也是另一个,dataType,你也指定(虽然有一个正确配置的服务器,你不应该得到  —服务器应该返回Content-Type标题与正确的MIME类型)。

+0

getTokenUrl可以正常工作,我会做一个提醒并且可以验证它是以http还是https模式工作。你对有关同源策略的评论,我认为它与域名有关,但你可能对端口是正确的,我会尝试在https模式下运行我的站点,看看是否有帮助。谢谢您的回复。 – dave2118 2013-05-06 12:02:26

+0

我只是在这两个网站上使用https,它的工作原理。简直不能相信我整个星期五浪费了一些东西。感谢您的帮助! – dave2118 2013-05-06 12:14:10

+0

@ dave2118:不客气!很高兴这有帮助。是的,有些浏览器对于SOP报告非常微妙。FWIW,如果您使用的是Chrome浏览器并查看了开发人员工具,则它有一个相当明确的错误消息(现在,它并不总是)。我不知道其他浏览器... – 2013-05-06 12:28:10