SpringBoot学习笔记(17)-使用JWT记录用户实时在线数

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


最近再做一个小程序项目,在这个项目中需要有一个管理员用户在线数实时刷新的功能,一开始用的是网上广为流传的做法,即创建一个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的代码,都在这篇文章中:

* https://blog.youkuaiyun.com/pbrlovejava/article/details/86597258

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

在这里插入图片描述根据时序图的这套方案,用户如果60s内没有任何操作(不调用接口去传递token)则判定该用户为下线状态,当用户重新登陆或者再次操作则判定为在线状态。

二、具体的代码实现

  • OnlineCounter

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


    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);
    }

 
    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;
    }
  • 获取实时在线人数
    @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整合Spring Security + JWT实现用户认证

登录和用户认证是一个网站最基本的功能,在这篇博客里,将介绍如何用SpringBoot整合Spring Security + JWT实现登录及用户认证

qq_44709990的博客 4万+

jwt在线解密工具分享

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

小元分享 4048

SpringBoot 使用 JWT 保护 Rest Api 接口

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。Jwt 主要应用场景:授权Authorization (授权) : 这是使用 JWT 的最常见场景。一旦用户登录,后续每个请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的 JWT 的一个特性,因为它的开销很小,并且可以轻松地跨域使用。

初学者 1951

SpringBoot整合JWT

一. JWT简介1. 什么是JWT?JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证;应用场景如用户登录。JWT详细讲解请见 github:https://github.com/jwtk/jjwt2. 为什么使用JWT?

java1024p的博客 1015

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

最近再做一个小程序项目,在这个项目中需要有一个管理员用户在线数实时刷新的功能,一开始用的是网上广为流传的做法,即创建一个session监听器,在用户登录时即创建一个session,监听器记录下来并且把count加一,当用户点击注销时把session给remove掉,count减一。但是这个方案只适合估计一个值,而不适合做精确的在线人数判断,譬如,当用户关闭浏览器时并不会触发session监听,当...

BoringError的博客 2万+

SpringBoot通过Jwt验证登陆用户的身份

一、概述 用户身份验证主要有传统的Session认证和基于Token的认证 1.1 传统的Session认证 服务端根据用户的SessionID去Session中读取用户是否登陆的信息。 用户在登陆时向我们的服务器发送用户名和密码,通过验证后,服务器需要记录用户已经登陆的信息,以便用户继续请求其他接口时通过验证,用户已经登陆的信息是保存在服务器的Session中,随着登陆用户的增多,服务端...

anron的专栏 1238

SpringBoot 快速集成 JWT 实现用户登录认证

前言:当今前后端分离时代,基于Token的会话保持机制比传统的Session/Cookie机制更加方便,下面我会介绍SpringBoot快速集成JWT库java-jwt以完成用户登录认证。 一、JWT 简介 1.1、 JWT的概念 JWT 是 JSON Web Token 的缩写,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT...

何哥的博客 2万+

CTFHUB------XSS反射型(WP)

文章目录前言XSS测试平台 前言 一开始我直接在上面写js脚本发现出错,最后发现只能通过下面的输入框来执行XSS测试,于是我们只能用XSS测试平台解决问题 XSS测试平台 注册一个XSS测试平台 这里随便填写 勾选默认模块就够了,点击下一步 这时会出现一个找个将代码复制 拼接到网站后缀name后面,点击send 这时平台会收到一个记录点开即可 得到flag ...

Y4tacker的博客 1万+

SpringBoot学习笔记(十三:JWT )

文章目录一、JWT简介1、JWT认证2、JWT的组成2.1、头部(header)2.2、载荷(payload)2.3、签名(signature)4、JWT 的使用方式二、SpringBoot整合JWT1、依赖2、工具类3、过滤器4、控制层三、测试1、访问登录接口2、访问需要登录的接口 一、JWT简介 JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑...

三分恶的博客 4858

AD元件库构建及维护之——DbLib公共元件库的使用教程

AD元件库构建及维护之——DbLib元件库的使用教程

qq_43105486的博客 2万+

SpringBoot之JWT令牌校验

您首先定义了一个JWT字符串,模拟了用户传递过来的token。

qq_73918355的博客 4301

LAMMPS实操系列(四): 高熵合金FCC-CoCrCuFeNi的退火模拟

我们对FCC-CoCrCuFeNi的退火模拟思路主要是,首先将材料以均匀的速率用100 ps从300 K升温至1000 K,然后在1000 K的温度下平衡100 ps,随后以均匀的速率用100 ps从1000 K降温至300 K,随后通过共轭梯度下降法做静力学结构优化得到退火后的结构。由于FCC-CoCrCuFeNi高熵合金被认为是潜在的工程结构材料[1],接下来我们将对退火前后的结构进行压缩模拟,对比退火前后FCC-CoCrCuFeNi高熵合金的力学性能变化,敬请各位读者关注我们的更新。

Ceshigo_CD的博客 4838

高德地图轨迹回放,消息框内展示车辆速度且随车辆移动-升级支持调整速度、回放进度

使用高德地图回放车辆GPS轨迹,并添加速度和回放进度条,并支持调整,效果如下: 新增的功能: 在基础版本,有如下升级 速度条:可以拖动以调整车辆回放速度,且从当前位置继续回放 进度条:进度条表示车辆已回放的百分比,且拖动进度条车辆定位到相应的位置并继续回放 ###思路分析 高德和marker回放相关的API //主要靠他回放 moveAlong(path:Array,speed:Number,f:Function,circlable:Boolean) //点移动到另一个位置,移动进度条车辆跟随移动

博客 1万+

springboot3+jdk17+shiro+jwt+redis

注意,jdk17的规范是Jakarta EE,虽然最新版本shiro适配springboot3,但是部分包要单独适配整个认证流程登录和登录之后每一次的认证是不一样的,登录后由工具类jwtUtil生成一个token,返回给前端用于之后每次请求。

hahaha的博客 4437

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器是多种方案中的优选项!是一种快速、准确、可靠、应用广泛的传感方案!可有效监测锂离子电池热失控风险,保障化学能储能电站安全!

chicheng_danxin的博客 2414

JWT整合Springboot

文章目录JWT整合Springboot1.基于JWT认证1.1 认证流程1.2 JWT优势1.3 JWT的结构是什么2.使用JWT3.整合Springboot JWT整合Springboot 1.基于JWT认证 1.1 认证流程 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。 后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部

小皮皮LL的博客 4073

Vivado ChipScope Debugging: Overcoming Common DRC Errors in FPGA Design

本文深入解析Vivado ChipScope调试中常见的DRC错误,特别是AVAL-244和AVAL-245等时钟相关问题,提供实用的Tcl命令解决方案和最佳实践。通过将DRC错误降级为警告的技巧,帮助FPGA设计者高效完成调试流程,同时强调何时应保留DRC检查以确保设计可靠性。

weixin_30335575的博客 417

【Flutter 问题系列第 85 篇】Xcode 运行 Flutter 提示 The Dart VM Service was not discovered after 60 seconds.

在 Xcode 上运行 Flutter 时提示 `The Dart VM Service was not discovered after 60 seconds. This is taking much longer than expected...`,意思是 `60秒后未发现Dart虚拟机服务。这比预期的要长得多`

“Allen Su”的博客 2242

如何在springboot项目中使用JWT

开发初期,我试图用session来保存暂时需要保存或者暂时生成的数据,例如保存用户的账号密码记住用户登录的状态、保存各行政区的预约号球数量、保存用户当天取消预约次数等。但是使用session应用于前后端分离项目存在一定的弊端,例如由于session是存在与服务器的物理内存中,所以在分布式系统中,这种方式将会失效、因为session认证本质基于cookie,由于基于Cookie,而cookie无法跨域,所以session的认证也无法跨域,对单点登录不适用。该信息可以被验证和信任,因为它是数字签名的。

weixin_51496936的博客 4705

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SpringBoot使用JWT详解

son web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。

qq_41765777的博客 2679

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JWT总结及在springboot中的使用

JWT,全称为JSON Web Token。JWT本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT Token,并且这个JWT Token带有签名信息,接受之后可以校验是否被篡改。具体的JWT认证流程如下:用户认证:用户向服务器提供登录信息(如用户名和密码)。Token生成:服务器验证用户信息无误后,生成一个JWT,该Token包含三个部分:Header(包含类型和加密算法)、Payload(包含用户相关信息)、Signature(用于验证Token的签名)

weixin_74004976的博客 1853

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【springboot开发】JWT实现用户验证登录

JWT完整流程如下:用户使用账号和密码发起 POST 请求;服务器使用私钥创建一个 JWT;服务器返回这个 JWT 给浏览器;浏览器将该 JWT 串在请求头中像服务器发送请求;服务器验证该 JWT;返回响应的资源给浏览器。

idiotyi的博客 2354

SpringBoot集成Jwt实现用户登录

前言 最近正在搭建一个SpringBoot+Vue的一套后台管理系统的模板,对于用户登录的功能使用了JWT来实现的,自己在学习SpringCloud微服务时使用的就是JWT,通过Cookie来传递token,实现用户的登录状态。 以下就是自己在SpringBoot中集成JWT过程。 1、加入maven依赖 <!-- jwt依赖 --> <dependenc...

qq_40126996的博客 1951
上一篇: SpringBoot学习笔记(16)-整合JWT做身份验证
下一篇: MySQL基础笔记(10)-实用SQL优化技巧小结
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论 1
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值