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

2023-11-18

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!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【React】单页面应用限制多开登录 的相关文章

  • 如何找到我的 typescript/react 模块的声明?

    我对前端技术非常 非常 陌生 特别是 React 和 TypeScript 当尝试做一件简单的事情 即使用反应组件时 我的问题出现了https github com ckeditor ckeditor5 https github com c
  • 使用 ScrollView 避免键盘输入

    我是 React Native 的新手 并且有一个我在 React Native 文档中没有找到的问题 我正在研究这个组件KeyboardAvoidingView https facebook github io react native
  • Next.js 使用 SSR 的本地存储问题

    我有以下自定义挂钩 它将数据存储在本地存储中 import useCallback useEffect useState from react export const useLocalStorage key initialValue gt
  • 当输入为空时如何禁用按钮?

    我试图在输入字段为空时禁用按钮 React 中最好的方法是什么 我正在做类似以下的事情
  • Excel JS - 获取范围数字格式

    我正在 React 中使用 Excel Office JS API 数据被推送到 Excel 范围 我正在尝试执行以下逻辑 检查范围 单元格格式是否为常规 如果是通用格式 则将格式设置为特定的日期时间格式 如果不是通用格式 请勿更改格式 看
  • 玩笑测试因 refs 和 Form 失败

    我有一个搜索栏组件 如下所示 render const onChangeTextInput this props return
  • useState 由于某种原因没有更新?

    当我尝试使用 axios 从后端 API 获取一些数据 并在由于某种原因获得结果后设置状态时 状态不会更新 当我尝试使用状态时 它只会向我显示一个空数组 但有趣的是当我console log res data 它会毫无问题地向我显示我的列表
  • 通过内联样式动态设置背景 Div 图像时不显示 | Next.Js

    我试图通过使用地图和外部 js 文件将图像存储为对象来从组件渲染图像 然后通过它们设置循环 将其设置为创建的每个 div 的不同背景图像 如果有意义的话 我将提供代码来更清楚地说明我想要完成的任务 在地图过程中 我试图定位对象方法 但我相信
  • 如何在不退出的情况下更新会话值?

    With NextAuth js https github com nextauthjs next auth 如何在不注销并再次登录的情况下更新会话对象内的值 例如 一旦用户登录 我就会使用会话中存储的 URL 来显示用户的头像 我还提供用
  • 如何在 React 中正确捕获 Materialize-CSS datepicker 值?

    我希望创建一个带有日期选择器 https materializecss com pickers html在我的 React 组件中物化CSS https materializecss com 该表单捕获的字段不多 而且结构相当简单 返回的表
  • 为什么现代 JavaScript 框架不鼓励与 DOM 直接交互

    在处理 AngularJS Angular 和 React 等 JS 框架时 我发现不鼓励直接与 DOM 交互 如果忽略警告 通常会导致错误 当我说 与 DOM 交互 时 我的意思是使用document getElementById myE
  • 没有找到任务运行程序配置?

    我有 新安装的 Visual Studio Professional 2017 V 15 9 4 视觉工作室解决方案 https learn microsoft com en us visualstudio ide solutions an
  • React 包的 CDN 链接以及在使用 React 时如何使用 CDN 中的脚本导入它

    我尝试在没有 NPM 和其他工具的情况下使用 React 而是通过添加 CDN 链接来使用它 但是如何导入依赖包 例如useState hook 如果它是通过另一个脚本标签添加的 那么它的 CDN 链接是什么 下面是我的代码
  • 如何使用 Typescript 从 mui 扩展调色板

    我正在尝试扩展 mui 提供的调色板 覆盖主色 次要颜色等效果很好 但如果我想在之后创建一组自定义颜色 我不知道如何使其工作 有很多没有打字稿的例子 但是当这个人进入游戏时 事情就变得更加棘手 假设我有这个 主题 tsx palette p
  • antd上传控件需要action函数,但我不需要它

    我正在使用 ant design 组件 并且有一个上传输入 https ant design components upload https ant design components upload 根据文档 需要对道具进行操作 但是 我不
  • 如何在 React JS 组件中预加载图像?

    我目前正在渲染一个子组件signInError发生 这signInError存储在父组件中 如果不为 null 则渲染
  • 如何在 NextJS 应用程序中处理公共和私有路由?

    我正在开发一个具有公共和管理路由的应用程序 在过去的 CRA 应用程序中 我们使用了自定义路由元素 但我们在 nextjs 中没有 Thins 我们有很多公共页面 我们有 20 个私人页面 路线 在 nextjs 中处理受保护的经过身份验证
  • 在react.js中调用API渲染数组图片

    我有 API 其中包括 pictures http storage web source images 2016 10 28 edac054f88fd16aee7bc144545fea4b2 jpg http storage web sou
  • 博览会错误:连接 ETIMEDOUT 104.197.216.164:443

    我尝试在我的 android 上通过 expo 运行 React Native android 模拟器 我在过去 24 小时内一直遇到此错误 Error connect ETIMEDOUT 104 197 216 164 443 at TC
  • 是否可以用 json 进行表达式/计算?

    我使用出色的 json server 作为应用程序的后端 它对于访问自定义端点以检索一些数据非常有用 但是如果它允许我进行计算 表达式以便我也可以模仿后端行为 那将会非常有用 以这个数据结构为例 products name football

随机推荐

  • Chatgpt与网络安全

    Chatgpt与网络安全 一 简介 2022年11月30日发布的ChatGPT以其丰富的知识与出色的自然语言交互能力引起了现象级的关注 在股市上甚至出现了 ChatGPT概念股 的当下 ChatGPT究竟对于网络安全行业会产生怎样的影响 是
  • Can't connect to local MySQL server through socket '/tmp/mysql.sock'

    出现如题错误时 采取以下解决办法 ps ef grep mysql 找到运行的mysql进程 kill掉 service mysqld restart 重启mysql进程
  • uniapp之uni.navigateBack返回携带参数

    代码 let pages getCurrentPages 获取所有页面栈实例列表 let nowPage pages pages length 1 当前页页面实例 let prevPage pages pages length 2 上一页页
  • k8s挂载目录_k8s学习之存储卷volume详解

    1 案例准备 存储卷以MariaDb来演示 其中每个节点需要准备如下镜像 docker pull mariadb 10 5 2 编写部署mariadb的资源文件 apiVersion apps v1kind Deploymentmetada
  • 【C++】运算符重载实现分数类的四则运算

    题目 定义一个分数类 Fraction 该类具有分子 分母两个成员属性 编写程序完成以下功能 定义合适的构造函数 定义前自增 后自增运算符重载 完成分子 1操作 定义分数加减乘除四则运算的运算符重载函数 Fraction h头文件代码 pr
  • SpringSecurity进阶:OAuth2.0详解

    OAuth2是什么 OAuth是一个为了方便用户登入而使用的授权流程 他的优点是不需要向第三方平台暴露我们的用户名和密码 而是使用授权服务器颁发短期的token和效验token的方式开放部分资源给第三方平台 OAuth是一个授权协议不是认证
  • css解决浏览器记住密码后input框的背景色为淡黄色的代码

    input webkit autofill textarea webkit autofill select webkit autofill webkit text fill color ededed important webkit box
  • 100-The 3n+1 problem

    100 The 3n 1 problem Time limit 3 000 seconds Problems in Computer Science are often classified as belonging to a certai
  • SpringBoot引入本地jar包,引用sdk

    1 引入本地jar包并通过maven打包成jar包 第一步 创建lib包 将所需的本地jar包导入 第二步 在pom文件中引导路径
  • 【开发工具】Python解释器的下载和安装(windows系统)

    Python解释器的下载和安装目录 一 Python解释器种类 二 CPython解释器的下载 三 CPython解释器的安装 四 验证解释器是否安装成功 一 Python解释器种类 CPython C语 开发的解释器 官 应 泛的解释器
  • HTML常用标签--整理篇

    HTML常用标签 文章目录 HTML常用标签 文本标签 HTML格式化标签 HTML图像标签 HTML表格标签 HTML表单标签 文本标签 常 文本标签如下
  • JaveWeb-12JDBC

    目录 一 JDBC 1 什么是JDBC 2 JDBC编程步骤 1 装载相应数据库的JDBC驱动并进行初始化 2 建立JDBC和数据库之间的Connection连接 3 创建Statement或者PreparedStatement接口 执行S
  • 二叉排序树(二叉搜索树)的时间复杂度&空间复杂度

    二叉排序树又称二叉查找树 二叉搜索树 它或是一棵空的二叉树 或是具有下列性质的二叉树 若它的左子树不空 则左子树上所有节点的值均小于根节点的值 若它的右子树不空 则右子树上所有节点的值均大于根节点的值 它的左右子树也都是二叉排序树 如果二叉
  • Redis为什么快

    Redis有多快 Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库 由C语言编写 官方提供的数据是可以达到100000 的QPS 每秒内查询次数 这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcach
  • [数据库] MySQL基础知识之日期判断及添加排序序号

    这篇文章主要记录MySQL中遇到的几个基础问题 希望文章对你有所帮助 包括 1 日期类型的判断 2 decode函数的替代方法 3 查询语句中添加一个排序的序号 4 子函数查询select a 1 日期类型判断 日期类型主要是 DATE 显
  • Python中if __name__ == ‘__main__‘:

    也看了一些别人的总结 这里就结合其他文章谈谈自己的理解 Python中 if name main 我刚开始看的时候就直接把他当成了一个项目运行的开始 至于为什么也没有仔细研究 后来看得多了 就研究了一下 name 是每一个python文件的
  • win10安装Ubuntu20.04虚拟机

    打开VMware Workstation的界面为下方的画面 注意第一次安装的时候我的计算机中是没有系统的 点击创建新的虚拟机会出现下方界面 选择自定义然后点击下一步 继续点击下一步选择稍后安装操作系统 继续点击下一步 继续下一步选择安装位置
  • 二级下拉菜单布局(纵向、横向)

    一级菜单 在ul列表内建立li元素并清除默认样式 让所有li元素左浮动并清除浮动 DOM中文档结构如下 ul class clearfix li a href 1 a li li a href 2 a li li a href 3 a li
  • Jupyter远程配置

    安装Jupyter pip install jupyter 生成默认配置文件 jupyter notebook generate config 生成密钥 python gt gt gt from notebook auth import p
  • 【React】单页面应用限制多开登录

    react 单页面应用限制多开登录 情景 测试小姐姐提了一个 BUG 在同一浏览器中打开两个页面 两个页面分别登录不同的账号 A 页面先登录A B 页面再登录B 此时回到 A 页面 交互时账号数据应该刷新为 B 登录的账号 分析 这个问题