在Javascript中使用document.domain的同源策略解决方案
我在Javascript中遇到了同源策略问题。我已经阅读了有关使用在Javascript中使用document.domain的同源策略解决方案,javascript,same-origin-policy,Javascript,Same Origin Policy,我在Javascript中遇到了同源策略问题。我已经阅读了有关使用document.domain变量解决此问题的方法,但我无法使该方法起作用。解决方法是,您应该能够将document.domain设置为'example.com',这样,如果您从foo.example.com运行代码,它就可以通过XHR从bar.example.com加载数据 解决方法的详细信息如下: 我的示例代码(不会产生期望的结果)是从类似http://foo.example.com/: <!DOCTYPE html
document.domain
变量解决此问题的方法,但我无法使该方法起作用。解决方法是,您应该能够将document.domain
设置为'example.com'
,这样,如果您从foo.example.com
运行代码,它就可以通过XHR从bar.example.com
加载数据
解决方法的详细信息如下:
我的示例代码(不会产生期望的结果)是从类似http://foo.example.com/
:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<script>
document.domain = 'example.com';
window.onload = function() {
var req = new XMLHttpRequest();
var url = 'http://bar.example.com/';
req.open('GET', url, true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4) {
var elem = document.getElementById('result');
if (req.status == 200) {
var data = req.responseText;
} else {
var data = "Error loading page: " + req.status;
}
elem.innerHTML = data;
}
};
req.send(null);
};
</script>
Result:<hr>
<div id="result"></div>
</body>
</html>
document.domain='example.com';
window.onload=函数(){
var req=新的XMLHttpRequest();
var url='1〕http://bar.example.com/';
请求打开('GET',url,true);
req.onreadystatechange=功能(aEvt){
如果(req.readyState==4){
var elem=document.getElementById('result');
如果(请求状态==200){
var数据=请求响应文本;
}否则{
var data=“错误加载页面:”+req.status;
}
elem.innerHTML=数据;
}
};
请求发送(空);
};
结果:
此代码的输出:
Result:
Error loading page: 0
结果:
加载页面时出错:0
如果我将url
更改为'http://foo.example.com/“
,一切正常。我的示例代码中有bug吗
我不想使用代理,因为它们速度较慢,效率较低,并且会增加web服务器上的流量。如果这个变通方法真的奏效,那就太酷了。这是一种“空中馅饼”的解决方案吗?
document.domain
允许帧/帧之间的通信。不是XHR
<body>
<iframe src="http://bar.example.com/"></iframe>
<script>
document.domain = 'example.com';
var ifr = document.getElementsByTagName('IFRAME')[0];
ifr.onload = function(e){
//will log the string "BODY" in the console
console.log(ifr.contentWindow.document.body.tagName);
};
</script>
</body>
document.domain='example.com';
var ifr=document.getElementsByTagName('IFRAME')[0];
ifr.onload=函数(e){
//将在控制台中记录字符串“BODY”
console.log(ifr.contentWindow.document.body.tagName);
};
如果删除带有
document.domain
的行,读取contentWindow的内容将抛出同源策略错误。我尝试过。在chrome中设置document.domain返回网络错误。开发人员工具遇到了同源策略问题。您是否尝试在父域和子域中将document.domain
设置为相同的值?如果不是,这会导致错误。我想这是因为iframe是一个完全不同的域。是的,域必须是相同的。这对于子域/端口问题非常有用。如果foo.example.com设置了document.domain=example.com,如果bar.foo.example.com设置了document.domain=example.com,它是否也能够进行通信?