码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【React】单页面应用限制多开登录


    react 单页面应用限制多开登录

    情景

    测试小姐姐提了一个 BUG : 在同一浏览器中打开两个页面,两个页面分别登录不同的账号.A 页面先登录A, B 页面再登录B,此时回到 A 页面,交互时账号数据应该刷新为 B 登录的账号

    分析

    这个问题,其实没什么必要,因为我不认为我们这个系统的单个使用者会同时拥有多个账号,但人家非说会有,那行吧,我说了不算,还是考虑解决问题吧。

    React 也是 SPA 应用,在一个页面中变更数据并不会直接影响到另一个页面,所以我们得让我们的应用与某些全局共享的东西保持同步,比如站点在浏览器中的本地存储。欸,这不就来了嘛,用户登录的数据(token,基础信息等)我们往往会通过 localStorage 持久化存储在浏览器中,只需要监听存储在 localStorage 的用户数据变化即可同步我们的页面。

    方案

    1. 在一个全局存在的组件中(如 Header,或者干脆 RootApp 等),监听 storage
    2. 绑定监听 storage 触发的函数,获取 localStorage 中的 userInfo(假设我们把登录成功后的用户数据全存在 userInfo 字段)
    3. 如果 userInfo 存在,更新 react 应用的状态中共享的用户数据,并强制刷新页面
    4. 如果 userInfo 没了,清空 react 应用的状态中共享的用户数据,并强制退出登录

    伪代码

    userManage.ts: 一些存取变更 localStorage 用户数据的封装

    export default {
      state,
      login,  // 这个就是 localStorage.setItem("userInfo", val)
      logout, // 这个就是 localStorage.clear(); 和 window.location 重定向到登录页
      getUserInfo, // 这个就是尝试 localStorage.getItem("userInfo") 并反序列化
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    某个全局组件:

    useEffect(() => {
      /** 监听 localStorage 的 userInfo 变化并同步 */
      async function syncUser() {
        const userInfo = localStorage.getItem('userInfo');
          if (userInfo) {
            userManage.login(JSON.parse(userInfo));
            window.location.reload();
          } else {
          	userManage.logout();
          }
        }
        window.addEventListener('storage', syncUser);
        return () => {
          window.removeEventListener('storage', syncUser);
        };
    }, []);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这样就基本实现了多开限制,Bingo!

  • 相关阅读:
    【区块链实战】什么是 P2P 网络,区块链和 P2P 网络有什么关系
    408知识框架总结——操作系统
    ffmpeg花屏解决(修改源码,丢弃不完整帧)
    什么是MySQL?MySql的学习之路是怎样的
    代码随想录第46天|139.单词拆分,了解多重背包,背包总结
    新员工碰到新问题 公司论坛帮解决
    android 离线语言合成(文字转语音)
    php Apple授权登录校验
    【阿旭机器学习实战】【19】如何在不减少分辨率的情况下降低图片存储空间?K-Means算法进行图片颜色点分类存储
    这一刻,听见华为FTTR的星光四重奏
  • 原文地址:https://blog.csdn.net/m0_51810668/article/details/132858340
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号