window.open() 打开的子页面往跨域的主页面传参问题 | 您所在的位置:网站首页 › vue跨域跳转的时候如何获取传参 › window.open() 打开的子页面往跨域的主页面传参问题 |
前言
前段时间有遇到比较奇葩的需求,就是正常情况下,我们站点在进行第三方登录的时候,会通过 window.open 的方法,打开一个服务端的接口页面,然后这个服务端的接口去判断当前是否有授权行为,如果有的话,就写入 cookie,然后关闭当前窗体, 如果没有的话,就跳转到第三方的授权页面,然后在授权结束,回调的时候,写入 cookie,然后关闭当前窗体,前端会监听当前的窗体,当发现已经关闭的时候,就会去请求自动登录的接口,这时候,因为 cookie 信息已经让服务端写入了,所以这时候就可以正常登录,这时候前端还会读取服务端的某一个 token cookie, 然后生成当前一次性令牌 token, 以供服务端进行校验。 正常情况下是没有问题的,但是由于 chrome 浏览器在新版本的时候,cookie的默认设置会有 SameSite=Lax,这时候就会导致前端读取不了服务端的 cookie (chrome 默认 cookie 的 SameSite=Lax,导致 http 模式的站点的第三方 cookie 无法进行跨域传输), 从而无法生成一次性访问 token 令牌, 这时候再去请求自动登录的接口,就会出现校验失败。 所以这边的想法是,服务端在生成 cookie 的时候,能不能在窗口关闭之前,往前端传 当前的一次性令牌的 token。这样子前端就可以带上这个 token 去进行自动登录的校验。 所以这边就会涉及到 window.open() 打开的子页面, 往主页面传参问题。 前端模拟情况接下来我们用前端模拟一下这种情况,看能不能实现,我们知道 window.open 打开的新窗口,是可以获取到主页面的窗口句柄的,也就是 window.opener, 所以原则上是可以操作这个主页面的 window 对象。 接下来我们模拟两个页面: 一个是主页面 parent.html: 点我打开新窗口 document.getElementById("btn").onclick = function(){ window.open('child.html',"新增","width=500,height=480,screenX=400,screenY=100"); } // 子页面调用的函数 window.triggerFn = function(data){ alert("trigger by child page, data is:" + data); }另一个是相同项目下的 child.html 页面: |
CopyRight 2018-2019 实验室设备网 版权所有 |