我在理解 JSON 的安全性方面有点困难,因为通常理论上不应该工作的事情,似乎可以。AFAIK,来自位于域 A 上的页面上的脚本的调用,不应该能够从域 B 接收数据。但是在下面的代码中,对一个外部域的调用失败,而另一个通过。两者都不是打包的 JSON 调用 (jsonp)。
为什么是这样?不应该禁止两者都通过浏览器安全检查吗?我在 Chrome 和 Firefox 中得到相同的结果。如果我在 dropbox.com 上托管以下 html 页面,Chrome 会给我以下错误消息:
XMLHttpRequest 无法加载 http://www.odinfond.no/rest/fund/calc/fundReturn?&id=300&oneTimeInvestment=100000&oneTimeInvestmentDate=2009-11-01&endDate=2010-11-01¤cy=NOK。Access-Control-Allow-Origin 不允许来源http://dl.dropbox.com 。
如果呼叫通过,我会得到 JSON 响应,可以通过单击此直接链接查看。对其他服务的调用成功返回。我在 Dropbox 上托管以下代码。在这里尝试一下。
<!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>