jQuery .ajax 调用 bit.ly 在 IE 中返回结果,但在 FF 或 Chrome 中不返回结果

2024-05-03

我正在尝试使用 jQuery 和 .ajax 调用来调用 bit.ly URL 缩短服务。

update我想知道这是否是跨域安全问题?我正在拨打电话mysite.com to bit.ly

<html><head>
<script type="text/javascript" src="http://www.twipler.com/settings/scripts/jquery.1.4.min.js"></script>
<script type="text/javascript">
jQuery.fn.shorten = function(url) 
{ 
  var resultUrl = url;

  $.ajax(
  {
     url: "http://api.bit.ly/shorten?version=2.0.1&login=twipler&apiKey=R_4e618e42fadbb802cf95c6c2dbab3763&longUrl=" + url,
     async: false,
     dataType: 'json',
     data: "",
     type: "GET",
     success: 
     function (json) {  resultUrl = json.results[url].shortUrl; } 
     });

   return resultUrl;
} ;
</script></head><body>
<a href="#" 
      onclick="alert($().shorten('http://amiconnectedtotheinternet.com'));">
      Shorten</a>   </body>    </html>

这适用于 IE8,但不适用于 FireFox (3.5.9) 或 Chrome。在这两种情况下,“json”均为空。

IE8 中的标头

GET http://api.bit.ly/shorten?ver..[SNIP]..dtotheinternet.com HTTP/1.1
Accept: application/json, text/javascript, */*
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0;
      SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; InfoPath.2; 
     .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30729)
Host: api.bit.ly
Connection: Keep-Alive

Chrome 中的标头

GET http://api.bit.ly/shorten?versio..[SNIP]..nectedtotheinternet.com HTTP/1.1
Host: api.bit.ly
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 
    (KHTML, like Gecko) Chrome/4.1.249.1045 Safari/532.5
Origin: file://
Accept: application/json, text/javascript, */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

所以唯一明显的区别是 Chrome 正在发送“Origin: file://”,但我不知道如何阻止它这样做。


使用 Fiddler 验证请求的实际负载和 bit.ly 服务的响应。将 IE 请求/响应与 Chrome 请求/响应进行比较,以找出不同之处。

我(疯狂)的猜测是,当 Firefox 和 Chrome 发送请求时,由于浏览器发出请求的方式不同,该服务会返回一条错误消息。特别是,您附加 url 参数的方式对我来说似乎有点可疑,为了以防万一,我会对它进行 url 编码。

Update:所以 HTTP 标头确实暴露了问题。 :-)

The 来源标头 http://www.w3.org/TR/access-control/当用户代理想要建议网站该请求是跨域请求时,由用户代理添加。显然Chrome 增加了支持 http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html最近对于这个标题。而且当然:

Origin 标头的详细信息是 仍在最后确定中。我们将更新 Google Chrome 中的实现为 该规范的演变基于 来自 Mozilla 和 W3C 的反馈 以及整个 IETF 社区。

您目前可能无法采取任何措施来阻止 Chrome 发送该标头。顺便说一句,似乎Originheader 是由 Firefox 3.6 首次引入的,我怀疑您是运行所有最新、最好的浏览器的人之一。 :-)

Btw, XMLHttpRequest确实有跨域限制。所以,我想知道 jQuery.Ajax 是否没有使用新的XDomainRequest http://msdn.microsoft.com/en-us/library/cc288060(VS.85).aspx在 IE8 上而不是XMLHttpRequest.

但回到您的问题 - 此时一切都表明唯一可用的解决方案是对您的站点进行 Ajax 调用并从您的服务器进行 bit.ly 调用。不是最佳的,我知道...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery .ajax 调用 bit.ly 在 IE 中返回结果,但在 FF 或 Chrome 中不返回结果 的相关文章

随机推荐