Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
如何在Socket.IO连接中自动更新并使用新的访问令牌_创想鸟

如何在Socket.IO连接中自动更新并使用新的访问令牌

如何在Socket.IO连接中自动更新并使用新的访问令牌

本文详细介绍了在基于react和socket.io的应用中,如何解决访问令牌过期或更新后,socket连接仍使用旧令牌的问题。通过重构socket初始化逻辑、利用`window.localstorage`的`storage`事件监听令牌变化,并结合react `useeffect`钩子,实现socket连接的动态断开与重连,确保其始终使用最新的访问令牌,从而提升应用的安全性和用户体验。

在现代Web应用中,实时通信通常依赖于WebSocket技术,而Socket.IO是其中一个流行的库。为了保护通信安全,我们通常会在Socket连接建立时附带一个访问令牌(Access Token)。然而,一个常见的问题是,当用户登录/登出或访问令牌刷新后,如果Socket连接仍然使用旧的、失效的令牌,会导致认证失败,影响实时功能的正常运行。本文将详细介绍如何优雅地解决这一问题,确保Socket连接始终使用最新的访问令牌。

问题分析:静态访问令牌的局限性

考虑以下典型的Socket.IO客户端初始化代码:

// socketUtils.jsimport io from "socket.io-client";// 在模块加载时获取accessTokenconst accessToken = window.localStorage.getItem("accessToken");const socket = io("https://localhost:3000", {  extraHeaders: {    Authorization: `Bearer ${accessToken}`,  },});socket.on("connect", () => {  console.log("Socket connected");});socket.on("connect_error", (error) => {  console.error("Socket connection error:", error);});// ... 其他事件监听export default socket;

这段代码的问题在于,accessToken是在socketUtils.js模块首次加载时从localStorage中读取的。这意味着,即使之后localStorage中的accessToken发生了变化(例如用户重新登录获取了新令牌),socket实例仍然会使用最初获取的旧令牌进行连接。这会导致Socket连接认证失败,或者在服务器端因令牌过期而被拒绝。

解决方案:动态更新令牌与Socket重连

要解决这个问题,我们需要实现以下两点:

使Socket初始化函数可接受动态令牌。监听localStorage中令牌的变化,并在变化时断开旧的Socket连接并使用新令牌重新建立连接。

1. 重构Socket初始化逻辑

首先,我们将socketUtils.js中的Socket初始化逻辑封装成一个函数,使其可以接收一个动态的accessToken参数。

// socketUtils.jsimport io from "socket.io-client";/** * 初始化并返回一个Socket.IO客户端实例。 * @param {string} accessToken - 用于认证的访问令牌。 * @returns {Socket} Socket.IO客户端实例。 */const initializeSocket = (accessToken) => {  const socket = io("https://localhost:3000", {    extraHeaders: {      Authorization: `Bearer ${accessToken}`,    },    // 可选:添加其他配置,例如重连策略    reconnectionAttempts: 5,    reconnectionDelay: 1000,  });  socket.on("connect", () => {    console.log("Socket connected with new token.");  });  socket.on("connect_error", (error) => {    console.error("Socket connection error:", error);  });  socket.on("disconnect", (reason) => {    console.log("Socket disconnected:", reason);  });  // ... 其他事件监听  return socket;};export default initializeSocket;

现在,initializeSocket函数可以根据传入的accessToken创建新的Socket连接。

2. 监听localStorage变化并管理Socket连接

为了在accessToken更新时自动触发Socket的重连,我们可以利用浏览器提供的window.addEventListener(“storage”)事件。当localStorage中的数据发生变化时,这个事件会被触发。

创建一个新的工具文件,例如tokenUtils.js,来处理令牌变化监听和Socket实例的管理。

// tokenUtils.jsimport initializeSocket from "./socketUtils"; // 导入重构后的Socket初始化函数let currentSocket = null; // 用于存储当前的Socket实例/** * 监听localStorage中accessToken的变化,并据此管理Socket连接。 * 当accessToken变化时,断开旧连接并建立新连接。 */const listenForTokenChanges = () => {  // 首次调用时,尝试使用当前存储的令牌初始化Socket  const initialAccessToken = window.localStorage.getItem("accessToken");  if (initialAccessToken) {    currentSocket = initializeSocket(initialAccessToken);  }  // 监听localStorage的storage事件  window.addEventListener("storage", (event) => {    // 检查变化的键是否是"accessToken"    if (event.key === "accessToken") {      const newAccessToken = event.newValue; // 获取新的accessToken值      if (newAccessToken) {        // 如果有新的令牌,且存在旧的Socket连接,则先断开        if (currentSocket) {          currentSocket.disconnect();          console.log("Old socket disconnected due to token change.");        }        // 使用新的令牌初始化新的Socket连接        currentSocket = initializeSocket(newAccessToken);        console.log("New socket initialized with updated token.");      } else {        // 如果newAccessToken为空(例如用户登出,令牌被清除)        if (currentSocket) {          currentSocket.disconnect();          currentSocket = null; // 清除Socket实例          console.log("Socket disconnected as accessToken was removed.");        }      }    }  });};/** * 获取当前的Socket实例。 * @returns {Socket|null} 当前的Socket实例,如果未初始化则为null。 */const getSocketInstance = () => currentSocket;export { listenForTokenChanges, getSocketInstance };

在上述代码中:

currentSocket变量用于全局维护一个Socket实例,确保我们总能访问到当前的活跃连接。window.addEventListener(“storage”, …)会监听所有localStorage和sessionStorage的变化。我们通过event.key === “accessToken”来确保只对我们关心的accessToken变化做出响应。event.newValue包含了更新后的accessToken。当accessToken更新时,我们首先调用currentSocket.disconnect()来关闭旧的连接,然后使用initializeSocket(newAccessToken)创建并赋值一个新的Socket实例。

3. 在React组件中集成

最后,我们需要在React应用的顶层组件(例如App.js或一个专门处理认证的组件)中调用listenForTokenChanges函数。这应该在组件挂载时执行一次。

// YourAppComponent.jsx (例如 App.js 或 Layout.js)import React, { useEffect } from "react";import { listenForTokenChanges } from "./tokenUtils";const YourAppComponent = () => {  useEffect(() => {    // 组件挂载时调用,开始监听令牌变化    listenForTokenChanges();    // 可选:如果需要在组件卸载时移除storage事件监听器,可以返回一个清理函数    // 但对于全局监听,通常不需要在组件级别移除,除非有特殊需求。    // return () => {    //   window.removeEventListener("storage", handler);    // };  }, []); // 空依赖数组确保只在组件挂载时执行一次  return (    
{/* 你的应用内容 */}

Welcome to the Realtime App!

);};export default YourAppComponent;

通过将listenForTokenChanges()放在useEffect钩子中,并使用空依赖数组[],我们确保了令牌变化监听器只在组件首次渲染时被注册一次。这样,无论用户在应用中如何导航,只要localStorage中的accessToken发生变化,Socket连接都会被自动更新。

注意事项与最佳实践

storage事件的局限性: storage事件只会在不同浏览器标签页或窗口之间,当localStorage发生变化时触发。如果在同一个标签页内通过localStorage.setItem()修改了值,storage事件不会在当前标签页内触发。然而,对于用户登录/登出导致令牌变化,通常伴随着页面重定向或刷新,或者是在不同的认证流程中,这种机制是有效的。如果需要在同一标签页内立即响应localStorage变化,可能需要结合自定义事件或React的状态管理来通知Socket。但对于大多数认证场景,上述方案已经足够。错误处理: 确保Socket连接的错误处理机制完善,例如connect_error、error等事件监听。令牌安全性: 将敏感的访问令牌存储在localStorage中存在一定的安全风险(如XSS攻击)。在生产环境中,应考虑使用更安全的存储机制,例如HTTP-only Cookies或内存存储结合刷新令牌机制。Socket实例的全局性: tokenUtils.js中的currentSocket变量是全局的,这意味着整个应用只有一个活跃的Socket连接实例。这通常是期望的行为,但也需根据应用架构进行评估。断开与重连的平滑性: 在实际应用中,断开旧Socket连接和建立新连接可能会导致短暂的服务中断。可以通过优化用户体验,例如在重连期间显示加载指示器,来缓解这一问题。

总结

通过上述方法,我们成功地解决了Socket.IO连接中访问令牌动态更新的问题。核心思路是将Socket初始化逻辑参数化,并利用window.addEventListener(“storage”)来监听localStorage中访问令牌的变化。当令牌更新时,我们主动断开旧的Socket连接并使用新的令牌建立一个新的连接。这种机制确保了Socket连接的认证始终基于最新的有效令牌,从而提高了应用的健壮性和安全性。

以上就是如何在Socket.IO连接中自动更新并使用新的访问令牌的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1539871.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
将HTML表格多行数据保存到Google Sheet的教程
上一篇 2025年12月21日 11:58:57
Node.js http.createServer 常见陷阱与正确响应处理
下一篇 2025年12月21日 11:59:06

相关推荐

  • 微软优化 Win11 系统托盘时钟秒数设置位置

    微软优化 Win11 系统托盘时钟秒数设置位置微软优化 Win11 系统托盘时钟秒数设置位置微软优化 Win11 系统托盘时钟秒数设置位置微软优化 Win11 系统托盘时钟秒数设置位置

    微软悄然对 windows 11 系统中托盘时钟显示秒数的配置进行了改动。这项功能之前由于被移除而招致用户批评,后来经过更新才重新出现。然而,其配置路径一度显得不太直观。近日,微软对其位置做了进一步优化。现在,用户可以在“设置” -> “时间和语言” -> “时间和日期”的“在系统托盘中…

    2026年9月27日 • 用户投稿
    100
  • sublime怎么快速在html标签外包裹一层新标签_sublime HTML标签快速包裹技巧

    sublime怎么快速在html标签外包裹一层新标签_sublime HTML标签快速包裹技巧sublime怎么快速在html标签外包裹一层新标签_sublime HTML标签快速包裹技巧sublime怎么快速在html标签外包裹一层新标签_sublime HTML标签快速包裹技巧sublime怎么快速在html标签外包裹一层新标签_sublime HTML标签快速包裹技巧

    使用Emmet的“Wrap with Abbreviation”功能可快速为HTML标签添加外层结构,先选中内容,打开命令面板执行命令,输入标签缩写如div.container即可完成包裹;通过自定义快捷键Ctrl+Alt+W能进一步提升操作效率。 在 Sublime Text 中快速给 HTML …

    2026年9月27日 • 用户投稿
    100
  • 获取父级 Option Group 的文本标签

    获取父级 Option Group 的文本标签获取父级 Option Group 的文本标签获取父级 Option Group 的文本标签获取父级 Option Group 的文本标签

    本文介绍了如何使用 JavaScript 获取 HTML 元素中选定 标签的父级 标签的文本标签。重点在于理解 closest() 方法的行为,以及嵌套 标签可能带来的问题,并提供替代方案以实现所需功能。 理解 closest() 方法 在 JavaScript 中,closest() 方法用于查找…

    2026年9月27日 • 用户投稿
    000
  • uc浏览器如何查看已保存的密码_UC浏览器已存账号密码查看教程

    uc浏览器如何查看已保存的密码_UC浏览器已存账号密码查看教程uc浏览器如何查看已保存的密码_UC浏览器已存账号密码查看教程uc浏览器如何查看已保存的密码_UC浏览器已存账号密码查看教程uc浏览器如何查看已保存的密码_UC浏览器已存账号密码查看教程

    首先通过UC浏览器密码管理功能查看保存的密码,手机端进入设置-隐私与安全-密码管理,验证身份后点击显示密码;电脑端在设置-其他-管理已保存的密码中查看,需验证系统账户;若无法直接查看,可使用开发者工具将密码框type属性由password改为text,临时明文显示密码。 如果您在使用UC浏览器时需要…

    2026年9月27日 • 用户投稿
    100
  • Android非Activity类中Toast消息的正确管理与调用

    Android非Activity类中Toast消息的正确管理与调用Android非Activity类中Toast消息的正确管理与调用Android非Activity类中Toast消息的正确管理与调用Android非Activity类中Toast消息的正确管理与调用

    本文旨在解决在Android非Activity类中调用Toast消息时遇到的类型不匹配问题。通过详细阐述Toast.makeText()方法对Context参数的要求,并提供将Activity的Context正确传递给静态工具方法的解决方案,实现Toast消息的集中管理和复用,从而提升代码的健壮性和…

    2026年9月27日 • 用户投稿
    200
  • 在win10系统怎么查看电脑显卡配置

    在win10系统怎么查看电脑显卡配置在win10系统怎么查看电脑显卡配置在win10系统怎么查看电脑显卡配置在win10系统怎么查看电脑显卡配置

    在win10系统中如何查看电脑显卡配置呢?不少小伙伴最近都遇到了这个难题,如果你还不太清楚具体的操作步骤,不用着急,本文将详细介绍在win10系统中查看电脑显卡配置的方法。 1、首先,我们可以在桌面空白处单击鼠标右键,然后选择“开始”按钮,在出现的菜单中找到并点击“运行”。 2、随后,在弹出的运行窗…

    2026年9月27日 • 用户投稿
    000
  • 文本动画的类选择器应用与优化

    文本动画的类选择器应用与优化文本动画的类选择器应用与优化文本动画的类选择器应用与优化文本动画的类选择器应用与优化

    本文详细介绍了如何将基于ID的文本动画转换为基于类的实现,以支持在多个HTML元素上复用同一动画效果。通过JavaScript动态生成带有自定义CSS变量的标签,并结合CSS @keyframes动画,实现了可灵活应用于页面中任意指定元素的波浪式文本动画,并提供了两种优化方案。 1. 问题背景与目标…

    2026年9月27日 • 用户投稿
    000
  • 点淘粉丝团怎么加入_点淘粉丝团如何加入获得专属福利待遇

    点淘粉丝团怎么加入_点淘粉丝团如何加入获得专属福利待遇点淘粉丝团怎么加入_点淘粉丝团如何加入获得专属福利待遇点淘粉丝团怎么加入_点淘粉丝团如何加入获得专属福利待遇点淘粉丝团怎么加入_点淘粉丝团如何加入获得专属福利待遇

    首先确认是否已加入主播粉丝团,未加入则无法领取专属福利。通过直播间或主播主页点击“加入粉丝团”并完成关注即可解锁特权。部分主播需完成点赞、评论等任务方可入团。成功入团后,在直播间查看粉丝专享价商品、参与抽奖或秒杀活动,并留意私信领取兑换码。 如果您在观看点淘直播时发现主播提供专属福利,但您无法领取,…

    2026年9月27日 • 用户投稿
    000
  • sublime怎么安装package resource viewer_sublime Package Resource Viewer安装方法

    sublime怎么安装package resource viewer_sublime Package Resource Viewer安装方法sublime怎么安装package resource viewer_sublime Package Resource Viewer安装方法sublime怎么安装package resource viewer_sublime Package Resource Viewer安装方法sublime怎么安装package resource viewer_sublime Package Resource Viewer安装方法

    首先需安装Package Control,再通过命令面板使用Package Control安装Package Resource Viewer,最后通过命令面板打开资源文件查看或复制修改插件内容。 在 Sublime Text 中安装 Package Resource Viewer 是一个很常见的需求…

    2026年9月27日 • 用户投稿
    000
  • 淘宝精准人群话费高怎么办?如何做好精准人群运营?3大核心策略破解精准人群运营难题

    淘宝精准人群话费高怎么办?如何做好精准人群运营?3大核心策略破解精准人群运营难题淘宝精准人群话费高怎么办?如何做好精准人群运营?3大核心策略破解精准人群运营难题淘宝精准人群话费高怎么办?如何做好精准人群运营?3大核心策略破解精准人群运营难题淘宝精准人群话费高怎么办?如何做好精准人群运营?3大核心策略破解精准人群运营难题

    在淘宝平台的运营中,“精准人群推广成本居高不下”已成为困扰众多商家的核心难题。据最新统计,超60%的中小型卖家在广告投放过程中遭遇人群溢价严重、转化效果不佳的瓶颈。如何在确保流量精准性的同时有效降低推广支出?本文将深入剖析精准人群运营背后的底层逻辑,并提供切实可行的优化方案。 一、为何你的精准人群花…

    2026年9月27日 • 用户投稿
    000
  • firefox浏览器怎么重置到初始设置 Firefox浏览器恢复出厂默认设置指南

    firefox浏览器怎么重置到初始设置 Firefox浏览器恢复出厂默认设置指南firefox浏览器怎么重置到初始设置 Firefox浏览器恢复出厂默认设置指南firefox浏览器怎么重置到初始设置 Firefox浏览器恢复出厂默认设置指南firefox浏览器怎么重置到初始设置 Firefox浏览器恢复出厂默认设置指南

    首先通过Firefox内置刷新功能恢复默认设置,打开菜单→帮助→更多故障排除信息→刷新Firefox;若问题仍存,可手动删除%APPDATA%MozillaFirefoxProfiles中xxxx.default-release文件夹以彻底重置;还可尝试以安全模式重新启动,禁用扩展排查冲突,确认后返…

    2026年9月27日 • 用户投稿
    200
  • windows怎么格式化u盘_Windows系统格式化U盘操作指南

    windows怎么格式化u盘_Windows系统格式化U盘操作指南windows怎么格式化u盘_Windows系统格式化U盘操作指南windows怎么格式化u盘_Windows系统格式化U盘操作指南windows怎么格式化u盘_Windows系统格式化U盘操作指南

    首先通过文件资源管理器、磁盘管理或命令提示符选择格式化方式,插入U盘后,依次按步骤操作:1. 文件资源管理器中右键U盘选择格式化,推荐exFAT文件系统并勾选快速格式化;2. 磁盘管理中找到U盘分区,设置为exFAT并执行快速格式化;3. 命令提示符以管理员运行,使用diskpart工具清理磁盘、创…

    2026年9月27日 • 用户投稿
    100
  • VSCode如何管理项目工作区 VSCode多文件夹工作区的使用技巧

    VSCode如何管理项目工作区 VSCode多文件夹工作区的使用技巧VSCode如何管理项目工作区 VSCode多文件夹工作区的使用技巧VSCode如何管理项目工作区 VSCode多文件夹工作区的使用技巧VSCode如何管理项目工作区 VSCode多文件夹工作区的使用技巧

    vscode通过.code-workspace文件实现多文件夹工作区管理,提供统一的开发上下文、跨项目搜索、集中式任务与调试配置及资源优化;1. 使用工作区可统一配置避免重复设置;2. 跨项目搜索更高效;3. 集中管理任务和调试复合配置;4. 比多个独立窗口更节省资源;5. 通过files.excl…

    2026年9月27日 • 用户投稿
    500
  • Grafana 随笔:安装篇

    Grafana 随笔:安装篇Grafana 随笔:安装篇Grafana 随笔:安装篇Grafana 随笔:安装篇

    grafana 是一款功能强大的开源可视化工具,适合与 zabbix、prometheus 等监控软件配合使用,生成美观且便捷的图表。 前言 前提条件 在开始安装之前,请确保已关闭 Selinux 和防火墙。 sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/…

    2026年9月27日 • 用户投稿
    100
  • 在Java中如何优化线程池大小

    线程池大小应根据任务类型和运行环境优化:CPU密集型设为CPU核心数+1,I/O密集型可设为核心数2~4倍;避免无界队列,选用有界队列并配置合理拒绝策略;通过监控活跃线程、队列长度等指标动态调优;优先使用ThreadPoolExecutor显式配置,避免Executors默认风险。 线程池大小的设置…

    2026年9月27日
    000
  • 夸克怎么关闭消息推送_夸克App消息通知关闭设置

    夸克怎么关闭消息推送_夸克App消息通知关闭设置夸克怎么关闭消息推送_夸克App消息通知关闭设置夸克怎么关闭消息推送_夸克App消息通知关闭设置夸克怎么关闭消息推送_夸克App消息通知关闭设置

    首先在夸克App的“我的”-“设置”中关闭“消息推送”开关,其次可在手机系统“设置”-“通知”中彻底关闭夸克的允许通知权限,以阻止不必要的消息推送。 如果您在使用夸克App时频繁收到不必要的消息推送,影响了日常使用体验,可以通过调整应用内的通知权限来管理这些推送。以下是具体的操作步骤: 本文运行环境…

    2026年9月27日 • 用户投稿
    000
  • 推荐6款好用却不为人知的效率软件!

    推荐6款好用却不为人知的效率软件!推荐6款好用却不为人知的效率软件!推荐6款好用却不为人知的效率软件!推荐6款好用却不为人知的效率软件!

    随着科技的不断进步,越来越多的日常辅助软件工具被广泛应用于办公环境中。这些工具只是表达我们需求的一种方式,因此在不同的工作环境或个人习惯下,每个人的使用方式也会有所不同。 接下来,小编将为大家介绍6款实用但鲜为人知的效率软件,能够显著提升你的工作效率! MindMaster MindMaster是一…

    2026年9月27日 • 用户投稿
    100
  • Deepseek 满血版携手 Runway Gen-2,生成超逼真视频内容​

    Deepseek 满血版携手 Runway Gen-2,生成超逼真视频内容​Deepseek 满血版携手 Runway Gen-2,生成超逼真视频内容​Deepseek 满血版携手 Runway Gen-2,生成超逼真视频内容​Deepseek 满血版携手 Runway Gen-2,生成超逼真视频内容​

    ai视频生成技术已实现一句话生成高质量视频。runway gen-2与deepseek联手,支持文字转视频、图像变视频,涵盖写实、动画等多种风格,生成速度快,适合短视频创作、广告设计等场景;同时也能将静态图转化为动态内容,提升影视后期、游戏预览效率;但需注意清晰度、时长限制、动作逻辑问题及版权风险,…

    2026年9月27日 • 用户投稿
    100
  • sublime怎么给robot framework文件设置高亮_sublime Robot Framework文件高亮配置

    sublime怎么给robot framework文件设置高亮_sublime Robot Framework文件高亮配置sublime怎么给robot framework文件设置高亮_sublime Robot Framework文件高亮配置sublime怎么给robot framework文件设置高亮_sublime Robot Framework文件高亮配置sublime怎么给robot framework文件设置高亮_sublime Robot Framework文件高亮配置

    首先安装Package Control,再通过它安装RobotFramework Assistant或Robot Framework Syntax Highlighting插件,接着将.robot文件关联为Robot Framework语法,最后验证关键字、变量、注释等是否正常高亮显示。 Subli…

    2026年9月27日 • 用户投稿
    600
  • 美团双11外卖超值套餐怎么找到_美团双11外卖超值套餐查找

    美团双11外卖超值套餐怎么找到_美团双11外卖超值套餐查找美团双11外卖超值套餐怎么找到_美团双11外卖超值套餐查找美团双11外卖超值套餐怎么找到_美团双11外卖超值套餐查找美团双11外卖超值套餐怎么找到_美团双11外卖超值套餐查找

    答案:可通过美团App首页轮播图、搜索“11.11”关键词、外卖频道活动入口及品牌旗舰店领取双11优惠。具体包括点击首页“双11狂欢节”进入主会场,搜索“5号5折”直达专题页,进入外卖频道参与“神抢手直播间”,或在瑞幸咖啡、蜜雪冰城等品牌旗舰店选购限时团购套餐,享受五折起、免单卡等超值优惠。 如果您…

    2026年9月27日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信