You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<script>
var newWindow = window.open('http://domain-b.com/b.html');
/* 向b.html发送消息 */
newWindow.postMessage('Hello', 'http://domain-b.com/b.html');
/* 双向通信,接收b.html的回复消息 */
var onmessage = function (event) {
var data = event.data;
var origin = event.origin;
var source = event.source;
if (origin == 'http://domain-b.com/b.html') {
console.log(data); //Nice to see you!
}
};
window.addEventListener('message', onmessage, false);
</scirpt>
接收方 http://domain-b.com/b.html
<script>varonmessage=function(event){vardata=event.data;varorigin=event.origin;varsource=event.source;if(origin=='http://domain-a.com/a.html'){console.log(data);//Hello/* 回复a.html的消息 */source.postMessage('Nice to see you!','http://domain-a.com/a.html');}};window.addEventListener('message',onmessage,false);</script>
跨域的本质
跨域是浏览器的限制,服务器之间的请求是没有跨域限制的
所以本地node起的服务器或者nginx服务器有两个作用
1、充当静态文件服务器,可以查看本地页面,以及监测文件改动
2、充当代理服务器,比如node的proxyTable用的是http-proxy-middleware中间件,原理是浏览器发给自己的服务端,然后由自己的服务端再转发给要跨域的服务端,做一层代理
在浏览器端跨域,可能导致获取到其他网站的敏感信息或者越权操作,比如拿到银行的登录状态或者执行转账操作,所以应当禁止。
服务端跨域没有这个问题,因为用户的这些状态信息都是在浏览器端保存的,服务器只能有自己网站的状态信息
到目前为止,常见的跨域方法有以下几种
还有这些老生常谈的,但不经常用的,就忽略而过吧
CORS 跨域资源共享
只需要后端同学支持就ok,前端不需要做很多额外工作(除了携带cookie)。
只要服务器返回的相应中包含头部信息
Access-Control-Allow-Origin: domain-name
,domain-name为允许跨域的域名,也可以设置成*,浏览器就会允许本次跨域请求后端允许CROS跨域,前端设置代理链接和允许带上cookie
后端header设置
Access-Control-Allow-Origin
不可以为*
,因为*
会和Access-Control-Allow-Credentials:true
冲突,需配置指定的地址前端设置,以vue+axios举个例子
代理的话,现在前后端分离的潮流,都是node服务器起的代理proxyTable
postMessage
otherWindow.postMessage(message, targetOrigin, [transfer]);
MDN-postMessage
发送者和接收者都可以通过message事件,监听对方的消息
message事件的事件对象event包含三个属性
发送方
http://domain-a.com/a.html
接收方
http://domain-b.com/b.html
WebSocket
插件:比如http-proxy-middleware
其实就是我们日常前后端分离中,node起的最多服务器设置,但一些脚手架,比如vue cli ,create-react-app都帮我们配置好了
The text was updated successfully, but these errors were encountered: