SpringBoot-使用心跳机制+JWT实现用户实时在线数统计

jwt在线生成网站 在线生成 JWT token的网站 https://dinochiesa.github.io/jwt/ 这是一个非常棒的一个Jwt token在线生成/编码/解码网站. 支持对称算法和非对称算法, 甚至可以生成 RSA 的public/private key. 关于 playload 中各个字段的说明: "payload": { "iss": "some auth server", // 颁... 阅读详情
AI摘要

本文介绍了一种使用JWT(Json Web Token)来精确统计用户实时在线数的方法,通过前端定时发送心跳包续期Token,后端维护一个过期时间Map,以此判断用户的在线状态,实现了60秒精度的在线人数统计。

最近再做一个小程序项目,在这个项目中需要有一个管理员用户在线数实时刷新的功能,一开始用的是网上广为流传的做法,即创建一个session监听器,在用户登录时即创建一个session,监听器记录下来并且把count加一,当用户点击注销时把session给remove掉,count减一。但是这个方案只适合估计一个值,而不适合做精确的在线人数判断,譬如,当用户关闭浏览器时并不会触发session监听,当下一次登录时仍然会让count加一;或者在session过期时,session监听并不能做一个实时的响应去将在线数减一,当用户在次登陆,由于cookie中含有的session_id不同而导致session监听器记录下session创建,而使count加一。

一、使用JWT做用户实时在线数判断的原理

本文不仔细地讲解什么是JWT,因为关于这个的文章已经写了很多了,但是在这里还是需要提一下什么是JWT。

1.1、什么是JWT

JWT即Json Web token(Json网络令牌),它由一种特殊的加密方式生成一串包含令牌状态(令牌过期时间、令牌签发时间、令牌的受众等)、用户数据等的字符串。前端在每次请求接口时都需要将这串令牌传送给后端校验这次请求是否正确,数据是否被篡改,用户是否已过期等。
在这里插入图片描述关于如何在SpringBoot下使用JWT的代码,都在这篇文章中:

* SpringBoot学习笔记(16)-整合JWT做身份验证_arong2048的博客-优快云博客

1.2、使用JWT做用户在线数统计的原理

在这里插入图片描述

实现思路:

根据时序图的这套方案,用户如果60s内没有任何操作(不调用接口去传递token)则判定该用户为下线状态,当用户重新登陆或者再次操作则判定为在线状态。这其实是心跳机制思想的一种实现,类似于Redis集群中的哨兵对Master主观下线的过程:每10s对Master发送一个心跳包,10s内没有响应则说明Master已经下线了。这里采用的是60s作为一个生存值,如果60s内该用户没有在此页面(如果在此页面,前端会间隔10s发送一次心跳包对Token进行续期+60s过期时间)上执行任何操作,也就不会携带Token发送请求到后端接口中,那么就无法给map中的token过期时间续期,所以该用户就处于过期状态。

二、具体的代码实现

  • OnlineCounter
@Component
public class OnlineCounter {
    //每次打开此类只初始化一次countMap
    private static Map countMap = new ConcurrentHashMap<String,Object>();

    /**
     * @auther: Arong
     * @description: 解析token并且将数据插入CountMap中
     * @param token
     * @return: void
     * @date: 2019/1/22 17:44
     */
    public void insertToken(String token){
        //获得当前时间(毫秒)
        long currentTime = System.currentTimeMillis();
        //解析token,获得签发时间
        Claims claims = null;
        try {
            claims = JWTUtils.parseJWT(token);
        } catch (Exception e) {
            throw new RuntimeException("token不存在或已过期");
        }
        Date issuedAt = claims.getIssuedAt();
        //以签发时间为key。当前时间+60s为value存入countMap中
        countMap.put(issuedAt.toString(),currentTime+60*1000);
    }

    /**
     * @auther: Arong
     * @description: 获取当前在线用户数
     * @param
     * @return: java.lang.Integer
     * @date: 2019/1/22 17:51
     */
    public Integer getOnlineCount(){
        int onlineCount = 0;
        //获取countMap的迭代器
        Iterator iterator = countMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String,Object>  entry = (Map.Entry<String, Object>) iterator.next();
            Long value = (Long) entry.getValue();
            if (value > System.currentTimeMillis()) {
                //过期时间大于当前时间则没有过期
                onlineCount++;
            }

        }

        return onlineCount;
    }
}

  • AdminController
 @Autowired
    private OnlineCounter onlineCounter;

    /**
     * @auther: Arong
     * @description: 获取当前实时在线人数(精确度为60s范围内)
     * @param
     * @return: int
     * @date: 2019/1/19 17:44
     */
    @GetMapping(value = "/getOnlineCount")
    public int getRealOnlineCount() {
        Integer onlines = onlineCounter.getOnlineCount();
        return onlines;
    }

  • JWTInterceptor
	@Autowired
    private OnlineCounter onlineCounter;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 允许跨域
        response.setHeader("Access-Control-Allow-Origin", "*");
        //后台管理页面产生的token
        String token = request.getHeader("authorization");
        //判断是否过期
        Optional.ofNullable(token)
                .map(n -> {
                    try {
                        return JWTUtils.parseJWT(n);
                    } catch (Exception e) {
                        throw new RuntimeException("token不存在");
                    }
                })
                .map(n->{
                    //存储该token方便记录在线人数
                    try {
                        onlineCounter.insertToken(token);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return n.getExpiration();
                })
                .orElseThrow(()->new RuntimeException("token已过期!请用户重新登陆!"));

        return true;
    }
  • 获取实时在线人数
/**
     * @auther: Arong
     * @description: 获取当前实时在线人数(精确度为60s范围内)
     * @param
     * @return: int
     * @date: 2019/1/19 17:44
     */
    @GetMapping(value = "/getOnlineCount")
    public int getRealOnlineCount() {
        Integer onlines = onlineCounter.getOnlineCount();
        return onlines;
    }
JWT加密工具 JSON Web Token(JWT),它定义了一种简洁的、自包含的协议格式,JWT可以使用HMAC算法或使用RSA的公钥/私钥对进行签名,防止被篡改。 阅读详情

相关推荐

JWT——概念、认证流程、结构、使用JWT、SpringBoot整合JWT

一、什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed.

Guizy 6659

JWT在线解密/JWT在线解码 - 加菲工具

JWT在线解密/JWT在线解码 地址:https://www.orcc.top/tools/jwt

1万+

SpringBoot单Token认证:滑动窗口续期与JWT最佳实践

JWT是Web应用身份认证的基础技术,其核心在于安全传递声明(claims)并验证签名与时效性。传统双Token模式因引入refresh token状态管理,导致前端逻辑复杂、安全隐患增多及运维成本攀升。单Token方案通过动态exp更新与滑动窗口续期机制,在保持无状态特性的前提下,实现服务端主导的透明续期,兼顾安全性与用户体验。该方案依赖JWT标准字段(iss/sub/aud/iat/exp)的严谨使用、自定义claims的精简嵌入,以及HTTP响应头(如X-Auth-Token)的规范传递。适用于Spr

weixin_34279184的博客 494

jwt在线解密工具分享

同时,了解JWT的特点和优点,可以更好地应用JWT来确保应用程序的安全性和功能性。JWT(JSON Web Tokens)是一种开放标准(RFC 7519),它定义了一种紧凑的,自包含的方法,用于以JSON对象的形式在各方之间安全地传输信息。- 轻量级和跨平台:由于JWT是基于JSON的,它具有轻量级和可移植性的特点,可以在不同的平台和编程语言之间进行交互。

小元分享 4048

SpringBoot校园电动车租赁系统设计与实现

微服务架构在现代分布式系统中扮演着重要角色,其核心思想是通过服务拆分实现松耦合和高内聚。SpringBoot作为Java生态的主流框架,凭借自动配置和起步依赖特性,大幅提升了开发效率。结合Spring Cloud组件,开发者可以快速构建具备服务发现、负载均衡等能力的微服务系统。在物联网领域,这种技术组合特别适用于智能硬件管理系统开发,例如校园电动车租赁场景。通过4G通信模组与云端交互,配合动态计价策略和分布式锁机制,既能保证硬件控制实时性,又能处理高并发订单请求。该项目采用Vue.js+ElementUI前

weixin_42529366的博客 221

SpringBoot WebSocket聊天室实战:从握手失败到消息广播

WebSocket 是 Web 实时通信的核心技术,其本质是基于 TCP 的全双工长连接,通过 HTTP 升级协议完成握手,再以帧(Frame)形式传输数据。在 SpringBoot 中,它常与 STOMP 协议结合使用,借助消息代理实现订阅/发布、目的地路由和会话管理,显著降低开发复杂度。该技术广泛应用于在线聊天、实时通知、协同编辑等场景,具备低延迟、高并发、轻量可控等工程优势。本文聚焦 SpringBoot 2.7.x 下的轻量级聊天室实现,深入解析 WebSocket 握手404、STOMP 消息丢失

weixin_33507732的博客 271

spring-boot 统计实时在线人数

1、配置pom文件依赖 &lt;!--统计实时人数--&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-websocket&lt...

MiChong的博客 1万+

jwt在线解密网站,可用于jwt的解码

正在测试JWT鉴权或者学习JWT的,需要解码token的可以看看。

SpringBoot 即时聊天 IM 完整实现(HTTP会话管理 + WebSocket实时推送 + 离线消息)

ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = ‘聊天消息表’ ROW_FORMAT = Dynamic;varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ‘会话最后一条消息内容(列表预览)’,

jwj20u1m9的博客 209

Spring boot通过HttpSessionListener监听器统计在线人数的实现代码

主要介绍了Spring boot通过HttpSessionListener监听器统计在线人数的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下

告别激活烦恼:Lattice Diamond 3.13 永久免费License申请与配置全攻略(Windows 64位)

本文详细介绍了Lattice Diamond 3.13永久免费License的申请与配置全流程,特别针对Windows 64位系统用户。从官网导航的隐藏路径到Host ID的获取方式,再到License文件的高级处理技巧和环境变量的深度配置,提供了全面的安装教程和疑难问题解决方案,帮助开发者彻底告别激活烦恼。

weixin_28736335的博客 429

SpringBoot心理健康平台开发实战与安全设计

现代Web应用开发中,SpringBoot作为主流Java框架,通过自动配置和起步依赖显著提升开发效率。其RESTful API设计原则与微服务架构天然契合,配合MySQL关系型数据库与Redis缓存,可构建高性能业务系统。在心理健康领域应用中,数据安全成为关键考量,需要实现包括JWT鉴权、AES加密传输、内容安全审核等多重防护。典型应用场景如匿名社区需处理敏感内容,需整合NLP情感分析技术;在线咨询系统依赖WebSocket实时通信,同时要解决移动端断网重连等工程问题。本文详解的校园心理服务平台案例,展示

weixin_34208185的博客 320

NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()

Please use torch.nn.Module.to_empty() instead of torch.nn.Module.to()输出(llama) (base) [root@localhost home]# nvidia-smi Unable to determine the device handle for GPU0000:09:00.0: Unknown Error。这是典型的“孤儿进程”,但它还是。(僵尸进程),占用 GPU 资源。如果进程仍然不消失,并且。,这意味着它的父进程是。

m0_61636632的博客 2098

SpringBoot 即时聊天 IM 完整实现(HTTP会话管理 \+ WebSocket实时推送 \+ 离线消息)

ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = ‘聊天消息表’ ROW_FORMAT = Dynamic;varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ‘会话最后一条消息内容(列表预览)’,消息入库、会话更新放入事务;

zsX5Pe0G6的博客 300

Cursor使用教程:用 Cursor 创建第一个 Java 项目

Cursor是一款基于VS Code的AI编程编辑器,专为开发者设计。安装前需确保JDK 8+、Maven 3.8+等环境配置,支持Windows系统。编辑器提供中文界面选项,可通过扩展市场安装语言包。创建Java项目支持手动和AI提示词两种方式:手动需创建目录结构并编写代码;AI方式则通过自然语言描述快速生成项目框架和代码。标准Java项目包含src/main/java主代码目录、src/test/java测试目录及pom.xml等配置文件。Maven项目中,pom.xml是核心配置文件,管理项目依赖与构

博客 3549

Git下载与安装

一、Git下载 二、Git安装

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 6万+

SpringBoot师生互动系统设计与实现

现代教育技术中,基于SpringBoot的Web应用开发正成为解决师生互动痛点的关键技术。通过MVC架构实现业务解耦,结合WebSocket协议构建实时通讯能力,这类系统能有效突破传统教学时空限制。在技术实现上,采用JWT认证保障安全性,Redis缓存提升并发性能,多级批改机制优化教学流程。典型应用场景包括在线作业管理、课程资源共享和即时答疑等,其中SpringBoot师生互动系统通过模块化设计,整合了RBAC权限控制、自动化批改等教学刚需功能,实测可支持2000人同时在线。这类解决方案特别适合需要快速响应

weixin_32932149的博客 176

开源的预测气象大模型与数据获取/可视化

「开源气象大模型与数据获取指南」摘要: 当前主流AI气象模型(如ECMWF的AIFS、DeepMind的GraphCast、华为Pangu等)主要基于ERA5/HRES数据训练。开源资源可通过ECMWF OpenData、GitHub仓库及Google Cloud获取,其中AIFS数据采用CCBY-4.0许可可商用,其他模型多有限制性许可。典型应用流程包括:1)通过Python包获取实时预报数据;2)加载预训练权重进行推理;3)使用xarray/cartopy或Zarr进行可视化。训练数据可从CDS下载ER

专注AI大模型,软件混淆,授权 799

SpringBoot+Vue城市公交调度系统设计与实现:从排班到实时监控

城市公交调度长期依赖人工经验与电话沟通,效率低且易出错。随着前后端分离架构的普及,SpringBoot与Vue的组合凭借开发效率高、生态成熟、部署简便等优势,成为中小型管理系统的理想方案。其核心价值在于通过规则化排班、实时车辆定位与自动运营报表,将计划线与实时线打通,形成调度闭环。实际工程中,MyBatis-Plus简化数据持久层,Redis缓存车辆状态与令牌,WebSocket实现位置推送,JWT保障接口安全,ECharts支撑大屏可视化。典型应用场景包括班次计划生成、司机排班、异常改派、客流统计等。文章

weixin_34315485的博客 425

关于YOLOv8的面试题(持续更新中...)

本章将计划更新关于YOLOv8中可能会成为面试题的关键技术点,计划持续更新,可能想到合适的问题我就会整理下更新到本博客中。

ice 4172

第4节:cesium 0基础发布离线地图(含源码+视频)

cesium发布离线地图

qq_29384639的博客 1597

SpringBoot高校食堂在线点餐系统设计与实现

在线点餐系统是餐饮行业数字化转型的核心解决方案,其技术原理基于B/S架构实现业务流程线上化。通过SpringBoot框架快速构建微服务架构,结合MySQL事务特性和Redis缓存机制,有效解决高并发场景下的数据一致性问题。在高校场景中,该系统可显著提升40%运营效率,关键技术包括JWT认证、WebSocket实时通信、乐观锁库存控制等。典型应用场景覆盖堂食点餐、外卖配送、智能推荐等环节,其中基于用户行为的个性化推荐算法和实时排队叫号功能尤为突出。

weixin_29297127的博客 201

【OpenClaw企业级智能体实战】第32篇:政企版OpenClaw安全落地指南——奇安信55页报告深度拆解与实战

2026年Q2,OpenClaw(俗称“龙虾”)安全风险集中爆发,公安部、工信部等监管机构密集发声,23万公网暴露实例、155个高危漏洞让企业“养虾”安全压力骤增。奇安信发布的55页《政企版龙虾安全使用指南》,以“看得清、管得住、用得好”为核心,构建了“端-网-云”三层防护体系。本文深度拆解这份报告的九大安全面与三大趋势,全景扫描奇安信、腾讯、360等头部厂商安全方案,提炼企业最低安全基线与实操配置,通过金融机构虚拟案例演示落地全流程,提供从资产摸底、规范制定到工具部署的完整解决方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 576

Java SpringBoot+Vue3+MyBatis web新能源充电系统系统源码|前后端分离+MySQL数据库

直接拿走,意外获得200多套代码,需要的滴我Java SpringBoot+Vue3+MyBatis web新能源充电系统系统源码|前后端分离+MySQL数据库(可提供说明文档(通过*AIGC*)

die_wang的博客 919

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WebSocket生产实战避坑指南:从Django到SpringBoot的7个硬核事实

WebSocket是一种基于TCP的全双工通信协议,其核心价值在于低延迟、高并发的实时数据交互能力。原理上,它通过HTTP升级握手建立连接,但实际运行依赖TCP保活、应用层心跳与帧机制协同保障稳定性。技术价值体现在金融行情推送、IoT设备同步、在线教育白板等强实时场景中,显著优于HTTP轮询或SSE。然而,真实工程落地常面临握手失败、消息乱序、内存暴涨、重连失效等典型问题,根源多在代理配置、帧类型误用、心跳设计缺陷及并发模型误判。本文聚焦websocket使用、websocket test client、p

weixin_34234721的博客 272

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: Vuex的常用项目结构以及请求过程
下一篇: Java基础(4)-Java8函数式编程
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值