我读到,浏览器安全策略背后的主要思想是,您不能从与页面本身所服务的域不同的域检索数据。但我不明白为什么我能这么做?
<!doctype html>
<html>
<head>
<title>Template</title>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
<script src="jscript.js"></script>
</head>
<body>
</body>
</html>
window.onload = function() {
var request = new XMLHttpRequest();
var url = "http://mbigras.github.io/geolocation/data.json";
request.open("GET", url);
request.onload = function() {
if (request.status == 200) {
var object2 = JSON.parse(request.responseText);
alert(object2.name + ", age " + object2.age);
}
}
request.send(null);
};因为当我使用index.html请求来自github的json数据时,这个页面不是从我家里的计算机(本地机器上的XMLHttpRequest )提供的吗?还是我误会了什么?
发布于 2015-11-19 23:05:40
这就是所谓的跨来源政策。内容的主机(在本例中是github)可以将HTTP头发送回您的脚本,上面写着“嘿,允许您向我做跨源请求!”然后,您的web浏览器(符合相同的来源策略)将允许请求发生。
实际上,最终丢弃跨源请求的是您的浏览器(而不是github服务器)。即使在向不允许跨源请求的位置发出AJAX请求时,浏览器仍在执行请求(称为飞行前请求)。
在实际请求发出之前,浏览器会对远程服务器执行预运行请求,以检查是否允许执行跨源请求。你的浏览器对远程服务器说:“嘿,如果你在另一个域上,我可以向你提出请求吗?”如果运行在另一端的web服务器不使用跨源标头进行答复,则答案是“否”。
在使用您引用的github url的情况下,github的web服务器正在用跨源标题进行回复,因此您的浏览器会说:“太好了,谢谢!”并按照您的预期执行GET或POST请求。
服务器可能发送给客户端的跨源标头示例可以是:
Access-Control-Allow-Origin: http://bob.com
Access-Control-Allow-Methods: GET, POST, PUT
Content-Type: text/html; charset=utf-8在本例中,服务器告诉客户机“允许来自bob.com的请求,只要它们是GET、POST或PUT请求”
https://stackoverflow.com/questions/33815980
复制相似问题