【React】单页面应用限制多开登录

news/2024/7/15 18:36:27 标签: react.js, 前端, javascript, 多开限制

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") 并反序列化
};

某个全局组件:

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);
    };
}, []);

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


http://www.niftyadmin.cn/n/5032268.html

相关文章

已解决:Ubuntu系统开启电脑一直出现Boot Menu

参考文章:重装系统后重启一直显示bootmenu,选择后一闪而过_linux重装windows后,开机直接进入到bootmenu界面,而且第一个显示的还是ubuntu_WhatUwannadO的博客-CSDN博客 装完系统后重新启动,总是进入boot menu界面,无法进入启动界…

Python继承及方法解析顺序(MRO)详解 | 示例与super()函数使用

文章目录 继承定义一个类 Animal定义一个类 Dog创建对象并调用方法类之间的关系多重继承定义一个类 Hashiqi创建对象并调用方法方法解析顺序(MRO)super() 函数C3 线性化算法示例super() 函数和钻石继承经典类和新式类总结 python精品专栏推荐python基础知…

【Python保姆级教程】List容器

文章目录 前言一、列表是什么二、列表的定义2.1 有初始值2.2 空列表使用方括号创建空列表使用list()函数创建空列表 三、list列表常用操作3.1 添加元素3.2 删除元素3.3 修改元素3.4 列表长度 四、遍历操作4.1 使用for循环4.2 使用while循环和索引 总结 前言 Python是一种广泛使…

【Oracle】Oracle系列--Oracle数据类型

文章目录 前言1. 字符类型2. 数字类型3. 大对象类型4. 时间及时间间隔类型5. 其他类型 前言 ORACLE基本数据类型,又叫内置数据类型( built-in datatypes)可以按类型分为:字符串类型、数字类型、大对象类型(LOB类型)、…

Pandas 数据变形和模型分析

数据概念 数据比对 在本练习中,我们使用灵活的比较技术对不同的DataFrame进行比较 import pandas as pd import randomrandom.seed(123) list1 [[A]*3,[B]*5,[C]*7] charlist [x for sublist in list1 for x in sublist] random.shuffle(charlist) ser1 pd.Se…

ChatGPT从小白到大神进阶之路:让GPT格式化输出

GPT 是一种大型语言模型,可以生成文本、翻译语言、编写不同类型的创意内容,并以信息丰富的方式回答您的问题。 它还可以格式化输出,这意味着您可以指定输出的内容和格式。 要格式化 GPT 的输出,您需要在问题或提示的末尾添加一个…

[Django-1] 快速建立项目

初始化Django 初始化项目创建app项目和app的关系下面的代码一般放在view.py中项目启动项目中中的urls.py和app中的urls.py的关系ModelDjango生成表查询理解 初始化项目 python -m pip install Django cd 到想要创建项目的目录 django-admin startproject DjangoStudy这时候在目…

12.建造者模式

如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,‘建造者(Builder)模式’,又叫生成器模式。建造者模式可以将一个产品的内部表象…