我对JSON周围的安全位理解有点麻烦,因为通常理论上不应该这样做的东西看起来确实如此。 AFAIK,来自驻留在域A上的页面上的脚本的调用不应该能够从域B接收数据。但是,在下面的代码中,对一个外部域的调用失败,而另一个经历。没有人打包JSON调用(jsonp)。为什么某些跨域JSON请求失败,但其他却不行?
这是为什么?不应该都不能通过浏览器安全检查吗?我在Chrome和Firefox中获得了相同的结果。如果我主办dropbox.com下面的HTML页面,浏览器给了我此错误消息:
的XMLHttpRequest无法加载 http://www.odinfond.no/rest/fund/calc/fundReturn?&id=300&oneTimeInvestment=100000&oneTimeInvestmentDate=2009-11-01&endDate=2010-11-01¤cy=NOK。 来源http://dl.dropbox.com不是 允许通过 访问控制允许来源。
通过点击this direct link可以看到如果通话已经通过,我会得到的JSON响应。对其他服务的调用成功返回。我在Dropbox上托管下面的代码。 Try it out here.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
<title>JSON/JSONP test</title>
<script src="jquery.js" type="text/javascript"></script>
</head>
<body>
<script>
service = 'http://www.odinfond.no/rest/fund/calc/fundReturn?';
parameters = {
id: '300',
oneTimeInvestment:'100000',
oneTimeInvestmentDate:'2009-11-01',
endDate:'2010-11-01',
currency:'NOK'
}
$.getJSON(service, parameters, function(data) {
alert("Success");
});
service = 'http://ws.geonames.org/postalCodeLookupJSON?'
parameters = {
postalcode:1540,
country:'NO'
}
$.getJSON(service, parameters, function(data) {
alert(data.postalcodes[0].adminName2);
});
</script>
<p>Use Firebug to see JSON response</p>
</body>
</html>
谢谢,这非常有意义!我认为这些请求几乎完全相同,但是我从来没有注意到响应头中的区别:-) – oligofren 2010-11-18 22:13:25