在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
有时候会遇到傻X需求,比如前端单点登陆!遇到需求,就要去想解决办法, 这里我给大家做一个简单的前端单点登陆的解决方案, 用到的就是postMessage跨域信息传输以及onstorage的监听。 本文用到的知识点 koa架设静态资源服务、跨域、postMessage的用法、onstorage监听storage 第一步、架设两个不同端口的服务 我们这里用koa2来搭建两个服务到不同的端口,来模拟一下真正的工作中需要出现的跨域情况。 非常的简单 主要用到 koa-static这个中间件 // localhost:4000 const Koa = require('koa'); const path = require('path') const static = require('koa-static') const app = new Koa(); //设置静态资源的路径 const staticPath = './static' app.use(static( path.join( __dirname, staticPath) )) console.log("服务启动在4000端口") app.listen(4000); // localhost:3000 const Koa = require('koa'); const path = require('path') const static = require('koa-static') const app = new Koa(); //设置静态资源的路径 const staticPath = './static' app.use(static( path.join( __dirname, staticPath) )) console.log("服务启动在4000端口") app.listen(4000); 第二步、跨域通讯postMessage 我们首先来看一下 postMessage的API otherWindow.postMessage(message, targetOrigin, [transfer]); otherWindow message targetOrigin transfer 可选 怎么样是不是很容易理解,这里给大家中文化一下。 要传输的那个(父)子窗口.postMessage(传输的内容, 传输到哪个地址, [权限是否转移(一般不用)]); 提前说一下,要想跨域传输,必须是父子页面,也就是说,是通过js Open的页面,或者ifream嵌套的页面 好了 我们开始来写代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <!-- postMessage和iframe解决普通的跨域问题 --> 我是端口3000网站的内容 <button onclick="send()">发消息给儿子</button> <iframe style="display:none" src="http://localhost:4000" frameborder="0"></iframe> <script> function send() { window.frames[0].postMessage({a:"1"},"http://localhost:4000"); // 触发跨域子页面的messag事件 } window.addEventListener('message', function(event) { console.info('儿子来信了', event); }, false); </script> </body> </html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <!-- postMessage和iframe解决普通的跨域问题 --> 我是端口4000网站的内容 <button onclick="send()">发消息给爸爸</button> <iframe style="display:none" src="http://localhost:4000" frameborder="0"></iframe> <script> window.addEventListener("message",function(event){ console.log("爸爸来信了:", event) },false) function send() { parent.postMessage({a:1}, 'http://localhost:3000'); // } </script> </body> </html> 写到这里我们已经实现了父子页面的跨域通讯,但是这个通讯只发生在一个窗口内啊,并没有达到我想要的效果,该怎么办呢。 监听数值变化,做出及时反应 到这里大家需要思考,什么东西是浏览器上的所有同域名网站都能看到的呢? 没错,storage,我们只需要对这个进行监听就好了。 这里我们选择监听 loacalStorage 现在我们对子页面做一下改进 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <!-- postMessage和iframe解决普通的跨域问题 --> 我是端口4000网站的内容 <button onclick="send()">发消息给爸爸</button> <iframe style="display:none" src="http://localhost:4000" frameborder="0"></iframe> <script> window.addEventListener("message",function(event){ console.log("爸爸来信了:", event) var data = JSON.stringify(event.data) window.localStorage.setItem("data",data) },false) window.onstorage(function(st){ console.log(st.key,st.value) }) function send() { parent.postMessage({a:1}, 'http://localhost:3000'); // } </script> </body> </html> 看,我们是不是到现在就能够针对跨域传输的内容做出响应了呢? 思考 现在我们做到了两个页面的跨域通讯,那么三个到多个的跨域通讯怎么做呢?其实一个道理啦。现在道理说给你了,写法自己去体验一下吧。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持极客世界。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论