当前位置: 首页 > news >正文

超链接打开新页签传递参数

背景

有一个需求,网站1点击按钮后跳转到页面2,页面1和页面2的域名不同,并且需要传递参数A,再

那么最简单的就是 在url上带参数A 比如 https://xx.com?A=xxx ,从url上的queryParam上就能获取参数

但很可惜,参数A由于是敏感数据,不能通过get请求传递,否则每个传输层(Nginx、Tomcat)都会存留该数据。

首先就找不通过url传递参数的方式,那么有的同学就会问,为什么不能把参数放请求体里,因为get方式实际也是支持请求体传参的,但他是打开链接啊!

方案一: postMessage

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为 https),端口号(443 为 https 的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

其实之前用于iframe父子页面的通信传参,纯前端操作,只要定义好发送的来源和接收origin,则可安全传输参数。

页面1:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Page 1</title>
</head>

<body>
    <!-- 创建一个 a 链接,点击时打开新的标签页 -->
    <a id="openPage2" href="page2.html" target="_blank">Open Page 2</a>

    <script>
        document.getElementById('openPage2').addEventListener('click', function (e) {
            // 阻止默认的链接跳转行为
            e.preventDefault();

            // 打开新的标签页
            const newWindow = window.open('page2.html', '_blank');

            if (newWindow) {
                // 监听新窗口的加载完成事件
                newWindow.onload = function () {
                    // 定义要传递的参数
                    const data = { a: 'xx' };
                    // 使用 postMessage 方法将参数传递给新窗口
                    newWindow.postMessage(data, '*');
                };
            }
        });
    </script>
</body>

</html>

页面2

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Page 2</title>
</head>

<body>
    <h1>Page 2</h1>
    <script>
        // 监听 message 事件,接收从页面 1 传递过来的参数
        window.addEventListener('message', function (event) {
            // 检查消息来源,确保是我们期望的消息
            if (event.origin === window.origin) {
                const data = event.data;
                console.log('Received data:', data);
                // 可以在这里处理接收到的参数
                if (data.a) {
                    console.log('Value of a:', data.a);
                }
            }
        });
    </script>
</body>

</html>

综上,原页面需要获取下一个tab页的window对象,并且通过这个window对象发起postmessage方法发送参数。但是打开页面2时,页面2不一定执行完监听逻辑。

关于安全性及兼容性参考: window.postMessage - Web API | MDN

所以逻辑优化成

页面2如何获取到页面1的window对象呢,就使用window.opener即可

方案二:hash

安全的本质是使用了get请求,参数层层记录,如果将参数放到#后,及hash则浏览器会识别为页面锚点,仅给页面使用,就不会传递到服务器上。

即 https://xx.com#A=xx 使用location.hash 获取参数。

最终选了方案二

相关文章:

  • 【目标检测】Efficient Feature Fusion for UAV Object Detection
  • AI编程: 一个案例对比CPU和GPU在深度学习方面的性能差异
  • 双指针7:LCR 007. 三数之和
  • C++智能指针weak_ptr
  • 从0开始的操作系统手搓教程24——完成我们的键盘驱动子系统
  • Ubuntu的软件源
  • 23种设计模式简介
  • 深入理解sync pool
  • 《深入浅出数据索引》- 大参林信息中心内部培训课程笔记
  • CefSharp 文件下载和保存功能-监听前端事件
  • Unity光照之Halo组件
  • 基于Spark的热门动漫推荐数据分析与可视化系统的设计与实现(采用Python语言Django框架,Hadoop,spider爬虫等技术实现)
  • 基于SpringBoot的智慧停车场小程序(源码+论文+部署教程)
  • 【科一】综合素质
  • 【轻松学C:编程小白的大冒险】---常量的定义、声明与应用场景 07
  • 13.数据结构(软考)
  • TypeError: Assignment to constant variable.
  • WebSocket:实现实时通信的利器
  • 【Bert系列模型】
  • 【记录一下学习】Embedding 与向量数据库
  • 淘宝客网站如何让做/网站软件开发
  • 什么是网站链接优化/互联网推广销售
  • 公司网站域名怎么加www./太原关键词优化服务
  • wordpress 美拍插件/seo发包软件
  • 典型的网站案例/营销活动推广策划
  • 动态网站设计的基本流程/营销网站定制公司