websocket实现实时数据推送,发布订阅重连单点登录功能

需求:使用websocket不借助插件实现发布,订阅,网络断开重连,单点登录后挤号的功能

1.单点登录(同一账号同一时间只有一个在线,禁止多用户登录)

 实现:在用户登录之后获取到token令牌并且存入到本地,可以判断token令牌是否失效来让用户退出登录,websocket的操作是让用户登录后连接到websocket并且发送指令,这边发送的指令是后端给的,之后前端进行接受消息,如果消息是退出登录的直接让他清空本地并且跳转到登录页就行

1.登录获取token令牌并且存储到localStorage

2.在layout也就是页面主体框架拿到token并且去连接websocket

3.连接成功后直接发送指令,之后再去监听返给前端的消息之后实现退出操作

     url = `${protocol}://websocket的地址,要后端给?token=${token}`;,

这个我举个例子,连接地址应该是这样的:ws://127.0.0.1:8080?token=362466325,

 ws.send(`msg:${this.data.id}`);这个也是后端定的要把账户的id给他,这样去监听登录

重连,之后消息返回loginOut后做退出登录的操作,如果链接因为各种原因关闭了,直接去请求重连。

 retryCount: 0,

 maxRetryCount: 5,

 retryInterval: 2000, // 重试间隔时间,单位:毫秒

注意!!websocket不能设置请求头携带token好像,试了很多次都不行,用ws插件也不行,只能拼接token给后端了,有更好的方法可以在评论区联系我

let ws;
let url = "";
export default { mounted() {this.connectWebsocket();},methods: {connectWebsocket() {let protocol = "ws";if (typeof WebSocket === "undefined") {console.log("您的浏览器不支持WebSocket");return;} else {if (window.location.protocol == "https:") {protocol = "wss";}let token = localStorage.getItem("token");url = `${protocol}://websocket的地址,要后端给?token=${token}`;// 打开一个wsws = new WebSocket(url);ws.onopen = () => {// 发送数据console.log("ws已连接!!");ws.send(`msg:${this.data.id}`);// this.$message.success("ws已连接!!");};// 发生错误时ws.onerror = (evt) => {console.log("ws错误:", evt);};// 关闭连接ws.onclose = (event) => {console.warn("WebSocket 已关闭");console.log("关闭代码:", event.code);console.log("关闭原因:", event.reason);// 处理连接断开事件this.handleWebSocketClose();};ws.onmessage = (evt) => {if (evt.data == "loginOut") {// 此时要做清空数据的操作this.$message.warning("您的帐号在另一地点登录,您已被迫下线!!");this.$router.replace("/");localStorage.clear();ws.close();ws.onclose = () => {console.log("ws断开连接成功");};}console.log(evt, "接收到的消息");};this.$bus.$emit("Websocket", ws);}},handleWebSocketClose() {if (this.retryCount < this.maxRetryCount) {console.log(`正在尝试第 ${this.retryCount + 1} 次重连...`);setTimeout(() => {this.connectWebsocket();this.retryCount++;}, this.retryInterval);} else {console.error("WebSocket 连接失败,已达到最大重试次数");}},
}
}

2.发布订阅

注意!!这边每次发布的时候都应该重新连一个新的消息,不然和之前的登录的消息搞混了就不好了,特别是在做操作的时候,比如el-table的编辑操作这些,每次关闭弹窗肯定要关闭websocket,如果和登录的消息搞混了,关闭弹窗就不能实时接收到单点登录传来的消息了

这个connectWebsocket和上面的不是一个,这个是需要实时推送页面的websocket连接,不会影响全局的单点登录的。

<script>
let websocket;
let url = "";export default {
connectWebsocket(data) {let protocol = "ws";if (typeof WebSocket === "undefined") {console.log("您的浏览器不支持WebSocket");return;} else {if (window.location.protocol == "https:") {protocol = "wss";}let token = localStorage.getItem("token");url = `${protocol}://后端的给的地址?token=${token}`;// 打开一个websocketwebsocket = new WebSocket(url);websocket.onopen = () => {// 发送数据// console.log("websocket已连接!!");websocket.send(data);this.$message.success("websocket已连接!!");};// 发生错误时websocket.onerror = (evt) => {console.log("websocket错误:", evt);};// 关闭连接websocket.onclose = (event) => {console.warn("WebSocket 已关闭");console.log("关闭代码:", event.code);console.log("关闭原因:", event.reason);// 处理连接断开事件this.handleWebSocketClose(data);};}},handleWebSocketClose(data) {if (this.retryCount < this.maxRetryCount) {console.log(`正在尝试第 ${this.retryCount + 1} 次重连...`);setTimeout(() => {this.connectWebsocket(data);this.retryCount++;}, this.retryInterval);} else {this.$message.error("WebSocket 连接失败!!");console.error("WebSocket 连接失败,已达到最大重试次数");}},
}
</script>

2.1模拟编辑操作需要发布消息

1.点击编辑后打开并且实时接收

    updData(row) {this.connectWebsocket(`data_imei:${row.id}`);websocket.onmessage = (evt) => {//如果收到的消息是msgUpdif(evt.data=='msgUpd'){let data = JSON.parse(evt.data);//把得到的数据进行json转换之后再给tableData进行展示就行let tableData.unshift(data)//也不能一直接受吧,那数据得多少啊,定义一下接收到多少条后截取if (tableData.length > 500) {tableData.splice(500);}}}
}

2.关闭弹窗后需要断开连接

  closeWebSocket() {if (websocket != null) {websocket.close();websocket.onclose = () => {console.log("websocket断开连接成功");};}},

3.在离开websocket推送页面后也关闭连接

  destroyed() {if (websocket != null) {websocket.close();websocket.onclose = () => {console.log("websocket断开连接成功");};}},

文章到此结束,希望对你所有帮助~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/145477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考 系统架构设计师系列知识点之云计算(3)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云计算&#xff08;2&#xff09; 所属章节&#xff1a; 第11章. 未来信息综合技术 第6节. 云计算和大数据技术概述 4. 云计算的发展历程 根据云计算的定义和内涵&#xff0c;这里将从虚拟化技术、分布式技术和软件应…

k8s自定义Endpoint实现内部pod访问外部应用

自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云&#xff0c; 一部分云原生的&#xff0c;一部分是实体的 业务上云期间逐步实现上云&#xff0c;保证各个模块之间的解耦性 比如使…

C/C++轻量级并发TCP服务器框架Zinx-框架开发003:转大写字母输出+责任链模式+代码重构思路及实现

文章目录 1 添加转大写字母输出功能2 责任链模式2.1 责任链的设计2.2 责任链的实现2.3 责任链的测试 3 代码重构3.1 类图设计3.2 重构设计 - 头文件3.3 重构实现 1 添加转大写字母输出功能 功能流程&#xff1a; stdin通道类中包含一个功能处理类对象功能处理类中包含一个stdo…

endnote20如何导入已经下载好的ris和pdf文件

查看此链接 1 文献导入 1.1 PDF导入 &#xff08;1&#xff09;方法一 打开&#xff1a;菜单栏–>Import–>FIle或folder 单个导入PDF或导入一个文件夹的PDF或通过拖曳多个PDF进入空白处完成导入 1.3 导入已经整理好的文献资料 已有的ris文件 打开&#xff1a;菜单栏–…

Python武器库开发-flask篇之路由和视图函数(二十二)

flask篇之路由和视图函数(二十二) 通过创建路由并关联函数&#xff0c;实现一个基本的网页&#xff1a; #!/usr/bin/env python3 from flask import Flask# 用当前脚本名称实例化Flask对象&#xff0c;方便flask从该脚本文件中获取需要的内容 app Flask(__name__)#程序实例需…

ubuntu访问github慢

https://juejin.cn/s/github%E6%89%93%E5%BC%80%E6%85%A2%E6%80%8E%E4%B9%88%E5%8A%9Eubuntu https://cloud.tencent.com/developer/article/2055030 亲测可用

【c++STL算数仿函数,关系仿函数,逻辑仿函数】

文章目录 C STL中的算数、关系和逻辑仿函数1. 算数仿函数2. 关系仿函数3. 逻辑仿函数 C STL中的算数、关系和逻辑仿函数 STL&#xff08;Standard Template Library&#xff09;是C标准库的一部分&#xff0c;提供了许多强大的工具和功能&#xff0c;其中包括仿函数&#xff0…

软文推广中媒体矩阵的优势在哪儿

咱们日常生活中是不是经常听到一句俗语&#xff0c;不要把鸡蛋放在同一个篮子里&#xff0c;其实在广告界这句话也同样适用&#xff0c;媒介矩阵是指企业在策划广告活动时&#xff0c;有目的、有计划的利用多种媒体进行广告传播&#xff0c;触达目标用户。今天媒介盒子就来和大…

pipeline jenkins流水线

Pipeline 是 Jenkins 中一种灵活且强大的工作流机制&#xff0c;它允许您以代码的形式来定义和管理持续集成和持续交付的流程。 Pipeline 的作用主要体现在以下几个方面&#xff1a; 可编排的构建流程&#xff1a;使用 Pipeline&#xff0c;您可以将一个或多个阶段&#xff08…

C#设置数据库索引

C#设置数据库索引 C# ASP.NET Core微服务设置数据库索引 C# ASP.NET Core微服务 设置数据库索引 设置数据库索引时&#xff0c;无需将.OnDelete(DeleteBehavior.Cascade)改为 .OnDelete(DeleteBehavior.NoAction)改变删除行为&#xff0c;向数据库添加索引的方法 modelBuild…

微信抽奖活动怎么做

微信抽奖活动&#xff1a;打破传统&#xff0c;创新互动&#xff0c;带给你超乎想象的惊喜体验&#xff01; 随着互联网的飞速发展&#xff0c;人们越来越热衷于参与各种线上活动。而微信&#xff0c;作为中国最大的社交平台之一&#xff0c;自然成为了各种活动的聚集地。今天…

Android设计模式--状态模式

真知即所以为行&#xff0c;不行不足谓之知 一&#xff0c;定义 当一个对象的内在状态改变时&#xff0c;允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 这么说可能很难理解&#xff0c;通俗来讲就是当一个对象它有多种状态的时候&#xff0c;把每一种状态的行为…

集合的removeIf方法

删除单个指定元素 如下&#xff1a;删除list中的字符串 “123” list.removeIf("123"::equals);删除另一个集合内包含的元素 即删除交集元素。 如&#xff1a;listA删除在listB中同样存在的元素&#xff1a; listA.removeIf(listB::contains);

大数据毕业设计选题推荐-机房信息大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

本地MQTT协议消息服务远程连接教程介绍

Mosquitto是一个开源的消息代理&#xff0c;它实现了MQTT协议版本3.1和3.1.1。它可以在不同的平台上运行&#xff0c;包括Windows、Linux、macOS等。mosquitto可以用于物联网、传感器、移动应用程序等场景&#xff0c;提供了一种轻量级的、可靠的、基于发布/订阅模式的消息传递…

高标准农田数字孪生

高标准农田是指通过土地整治、土壤改良、水利设施、农电配套、机械化作业等措施&#xff0c;提升农田质量和生产能力&#xff0c;达到田块平整、集中连片、设施完善、节水高效、宜机作业、土壤肥沃、生态友好、抗灾能力强、与现代农业生产和经营方式相适应的旱涝保收、稳产高产…

office2010图标显示不正常

问题&#xff1a;安装office2010软件后&#xff0c;.doc文件图标不正常&#xff0c;而.docx文件图标正常 &#xff01; 解决方法&#xff1a;亲测有效 1、使用快捷键WinR&#xff0c;打开“运行”&#xff0c;输入regedit&#xff0c;按回车键。 2、对于 Word 2007/Word 2010…

【docker启动的Jenkins时,遇到时区问题处理】

1、查看容器中的时区 [rootlocalhost jenkins]# docker exec -it jenkins cat /etc/timezone Etc/UTC而本地使用的是Asia/shanghai [rootlocalhost jenkins]# timedatectl | grep Time zoneTime zone: n/a (CST, 0800)###查看 [rootlocalhost jenkins]# cd /usr/share/zoneinf…

【Coppeliasim仿真】 坐标系间平滑插补

在仿真环境中控制两个参考框架&#xff08;ReferenceFrame1和ReferenceFrame2&#xff09;之间进行平滑的插值运动。在两个参考框架之间插值运动的过程中&#xff0c;使用了两种不同的方法&#xff0c;通过设置useMethodNb来选择使用的方法。 方法1使用了旋转轴和角度的计算&a…

Windows 小狼毫 如何在安装后指定用户配置文件文件夹

Windows 小狼毫 如何在安装后指定用户配置文件文件夹 打开小狼毫的安装目录&#xff0c;双击目录中的 WeaselSetup.exe 就会弹出截图中的那个窗口&#xff0c;然后指定你的用户文件夹目录就可以了