0

我整个星期五都花在这上面,我想我会在星期一进来看看我能不能得到一些帮助。这是一个摘要:

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

1 回答 1

1

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

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

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


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

于 2013-05-06T11:56:36.830 回答