jQuery .getJSON 使用 ajax。http://api.jquery.com/jquery.getjson/
.ajax 使用 XMLHttpRequest
chrome 和其他浏览器的 web 安全性会阻止 XMLHttpRequest 访问本地文件,因为这是一个安全问题。
通过深度安全:本地网页
http://blog.chromium.org/2008/12/security-in-depth-local-web-pages.html
您收到来自攻击者的电子邮件,其中包含您下载的网页作为附件。
您在浏览器中打开现在的本地网页。
本地网页创建一个 iframe,其来源为
https://mail.google.com/mail/。
因为您已登录到 Gmail,所以框架会在您的收件箱中加载邮件。
本地网页通过使用 JavaScript 访问 frames[0].document.documentElement.innerHTML 来读取框架的内容。(互联网网页将无法执行此步骤,因为它来自非 Gmail 来源;同源策略会导致读取失败。)
本地网页将收件箱的内容放入 a 中,并通过表单 POST 将数据提交到攻击者的 Web 服务器。现在攻击者拥有了您的收件箱,这可能对发送垃圾邮件或识别盗窃有用。
不需要同源策略安全的数据的解决方案是填充 json。由于 jsonp 不是一种安全的数据格式。Jsonp 没有同源策略。
/* secured json */
{
"one": "Singular sensation",
"two": "Beady little eyes",
"three": "Little birds pitch by my doorstep"
}
/* padded json aka jsonp */
Mycallback ({
"one": "Singular sensation",
"two": "Beady little eyes",
"three": "Little birds pitch by my doorstep"
});
由于使用 jsonp,json 被包装在一个有效的 javascript 函数中,它可以像任何人将任何 javascript 添加到页面一样打开。
var element = document.createElement("script");
element.src = "jsonp.js";
document.body.appendChild(element);
你的回调处理数据,
function Mycallback(jsondata) {
}
这在功能上与ajax请求相同,但不同,因为它是一个jsonp请求,实际上更容易。
jQuery 库也直接支持 jsonp http://api.jquery.com/jquery.getjson/请参阅使用 Flickr 的 JSONP API 的示例;除非知道双重标准,否则他们甚至可能不会注意到正在使用 jsonp。
(function() { /* jsonp request note callback in url, otherwise same json*/
var flickerAPI = "http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?";
$.getJSON( flickerAPI, {
tags: "mount rainier",
tagmode: "any",
format: "json"
})
.done(function( data ) {
$.each( data.items, function( i, item ) {
$( "<img>" ).attr( "src", item.media.m ).appendTo( "#images" );
if ( i === 3 ) {
return false;
}
});
});
})();
可以启用对 json 的本地访问,但具体取决于浏览器。
使用 --allow-file-access-from-files 在 chrome 中启用它。https://code.google.com/p/chromium/issues/detail?id=40787
仅供参考:他们正在研究加密的 json https://datatracker.ietf.org/doc/html/draft-ietf-jose-json-web-encryption-08我相当肯定不会有在本地使用它的方法目的是让它真的非常安全。