浏览器原理面试题 前端「前端面试进阶之浏览器原理」(14)


target: 'http://www.domain2.com:8080',
changeOrigin: true,
// 修改响应头信息,实现跨域并允许带cookie
onProxyRes: function(proxyRes, req, res) {
res.header('Access-Control-Allow-Origin', 'http://www.domain1.com');
res.header('Access-Control-Allow-Credentials', 'true');
},
// 修改响应信息中的cookie域名
cookieDomainRewrite: 'www.domain1.com' // 可以为false,表示不修改
}));
app.listen(3000);
console.log('Proxy server is listen at port 3000...');
2)vue框架的跨域
nodevuewebpackwebpack-dev-server搭建的项目,跨域请求接口 , 直接修改webpack.config.js配置 。开发环境下,vue渲染服务和接口代理服务都是webpack-dev-server同一个,所以页面与代理接口之间不再跨域 。
webpack.config.js部分配置:
module.exports = {
entry: {},
module: {},
...
devServer: {
historyApiFallback: true,
proxy: [{
context: '/login',
target: 'http://www.domain2.com:8080', // 代理跨域目标接口
changeOrigin: true,
secure: false, // 当代理某些https服务报错时用
cookieDomainRewrite: 'www.domain1.com' // 可以为false,表示不修改
}],
noInfo: true
}
}
(6)document.domainiframe跨域
此方案仅限主域相同,子域不同的跨域应用场景 。实现原理:两个页面都通过js强制设置document.domain为基础主域,就实现了同域 。
1)父窗口:(domain.com/a.html)
1)子窗口:(child.domain.com/a.html)
(7)location.hashiframe跨域
实现原理:a欲与b跨域相互通信,通过中间页c来实现 。三个页面 , 不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信 。
具体实现:A域:a.html -> B域:b.html -> A域:c.html,a与b不同域只能通过hash值单向通信,b与c也不同域也只能单向通信,但c与a同域 , 所以c可通过parent.parent访问a页面所有对象 。
1)a.html:(domain1.com/a.html)
2)b.html:(.domain2.com/b.html)
3)c.html:(http://www.domain1.com/c.html)
(8)window.nameiframe跨域
window.name属性的独特之处:name值在不同的页面(甚至不同域名)加载后依旧存在 , 并且可以支持非常长的 name 值(2MB) 。
1)a.html:(domain1.com/a.html)
var proxy = function(url, callback) {
var state = 0;
var iframe = document.createElement('iframe');
// 加载跨域页面
iframe.src = https://www.pyjctjgg.com/keji/url;
// onload事件会触发2次 , 第1次加载跨域页,并留存数据于window.name
iframe.onload = function() {
if (state === 1) {
// 第2次onload(同域proxy页)成功后,读取同域window.name中数据
callback(iframe.contentWindow.name);
destoryFrame();
} else if (state === 0) {
// 第1次onload(跨域页)成功后,切换到同域代理页面
iframe.contentWindow.location = 'http://www.domain1.com/proxy.html';
state = 1;
}
};
document.body.appendChild(iframe);
// 获取数据以后销毁这个iframe , 释放内存;这也保证了安全(不被其他域frame js访问)
function destoryFrame() {
iframe.contentWindow.document.write('');
iframe.contentWindow.close();
document.body.removeChild(iframe);
}
};
// 请求跨域b页面数据
proxy('http://www.domain2.com/b.html', function(data){
alert(data);
});
2)proxy.html:(domain1.com/proxy.html)
中间代理页,与a.html同域,内容为空即可 。
3)b.html:(domain2.com/b.html)
通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域 。这个就巧妙地绕过了浏览器的跨域访问限制 , 但同时它又是安全操作 。