spring boot jwt生成token

1、引入jwt依赖

<!--jwt的依赖-->
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.18.3</version>
</dependency>

2、创建TokenUtils工具类

package com.pn.utils;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.pn.entity.CurrentUser;
import com.pn.entity.User;    //实体类
import com.pn.exception.BusinessException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;import java.time.Duration;
import java.util.Date;/*** token工具类*/
@Component
public class TokenUtils {//注入redis模板@Autowiredprivate StringRedisTemplate stringRedisTemplate;Redis  0库// @Autowired// @Qualifier("reactiveRedisTemplateDb0")// private ReactiveRedisTemplate<String, Object> redis;//注入配置文件中的warehouse.expire-time属性 -- token的过期时间@Value("${warehouse.expire-time}")private Long expireTime;/*** 常量:*///token中存放用户id对应的名字private static final String CLAIM_NAME_USERID = "CLAIM_NAME_USERID";//token中存放用户名对应的名字private static final String CLAIM_NAME_USERCODE = "CLAIM_NAME_USERCODE";//token中存放用户真实姓名对应的名字private static final String CLAIM_NAME_USERNAME = "CLAIM_NAME_USERNAME";// 真正的生成的jwt token的方法private String sign(User user) {String token = JWT.create().withClaim(CLAIM_NAME_USERID, user.getUserId()).withClaim(CLAIM_NAME_USERCODE, user.getUserCode()).withClaim(CLAIM_NAME_USERNAME, user.getUserName()).withIssuedAt(new Date())//发行时间.withExpiresAt(new Date(System.currentTimeMillis() + (expireTime * 1000L)))//有效时间.sign(Algorithm.HMAC256(user.getUserPwd()));//指定签名return token;}/*** 方法一,jwt生成的 token存Redis,用Redis判断是否存在* 将当前用户信息以用户密码为密钥生成token的方法*/public String loginSign(User user){//生成tokenString token = sign(user);//将token保存到redis中,并设置token在redis中的过期时间//stringRedisTemplate.opsForValue().set(token, token, Duration.ofSeconds(28800)).subscribe();stringRedisTemplate.opsForValue().set(token, token, expireTime);return token;}/*** 方法二,解析前端jwt生成的token进行校验* 创建CurrentUser实体类接收* 从客户端归还的token中获取用户信息的方法*/public CurrentUser getCurrentUser(String token) {if(StringUtils.isEmpty(token)){throw new BusinessException("令牌为空,请登录!");}//对token进行解码,获取解码后的tokenDecodedJWT decodedJWT = null;try {decodedJWT = JWT.decode(token);} catch (JWTDecodeException e) {throw new BusinessException("令牌格式错误,请登录!");}//从解码后的token中获取用户信息并封装到CurrentUser对象中返回int userId = decodedJWT.getClaim(CLAIM_NAME_USERID).asInt();//用户账号idString userCode = decodedJWT.getClaim(CLAIM_NAME_USERCODE).asString();//用户账号String userName = decodedJWT.getClaim(CLAIM_NAME_USERNAME).asString();//用户姓名if(StringUtils.isEmpty(userCode) || StringUtils.isEmpty(userName)){throw new BusinessException("令牌缺失用户信息,请登录!");}return new CurrentUser(userId, userCode, userName);}}

3、使用

//  注入token对象@Autowiredprivate TokenUtils tokenUtils;@RequestMapping("/login")public String login(@RequestBody LoginUser loginUser) {// 生成tokenString token = tokenUtils.loginSign("传入实体类");System.out.println(token);return token ;}

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

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

相关文章

豪越科技:融合低空经济的消防一体化安全管控解决方案

在科技飞速发展的当下&#xff0c;2025 年低空经济正处于规模化商用的关键节点&#xff0c;其在应急救援、物流配送等多领域展现出巨大潜力。豪越科技凭借其先进的消防一体化安全管控方案&#xff0c;与低空经济深度融合&#xff0c;打造出一套更为高效、智能的消防解决方案&am…

清华大学 | DeepSeek第十版!《DeepSeek政务应用场景及解决方案》

清华大学发布的《DeepSeek政务应用场景及解决方案》研究报告&#xff0c;聚焦人工智能技术DeepSeek在政府治理与公共服务中的创新实践&#xff0c;系统阐述了其如何通过智能化技术赋能政务数字化转型&#xff0c;推动治理能力现代化。报告指出&#xff0c;DeepSeek作为融合大数…

R语言双Y轴折线图+相关性注释

目录 包和数据 作图代码及详解 包和数据 rm(list ls()) library(ggpubr) library(scales) library(ggplot2)data <- iris##鸢尾花数据集 data1 <- data[1:30,c(1,2,3)] > head(data1)Sepal.Length Sepal.Width Petal.Length 1 5.1 3.5 …

Android Compose 框架隐式动画之过渡动画深入剖析(二十六)

Android Compose 框架隐式动画之过渡动画深入剖析 一、引言 在移动应用开发领域&#xff0c;用户体验始终是至关重要的。动画效果作为提升用户体验的关键元素&#xff0c;能够为应用增添生动性和交互性。Android Compose 作为现代 Android UI 工具包&#xff0c;为开发者提供…

sql server如何提高索引命中率

#新星杯14天创作挑战营第9期# 前言 近期发现以前开发的系统运行缓慢&#xff0c;经排查&#xff0c;发现有很大的优化空间。数据库版本使用的是sql server&#xff0c;主要有以下一些问题点&#xff1a;数据表无索引、一些不规范的写法&#xff08;例如in、大表关联&#xff0…

Qt进程间通信:QSharedMemory 使用详解

1. 什么是 QSharedMemory&#xff1f; QSharedMemory 是 Qt 中用于进程间共享内存的类。它允许多个进程共享一块内存区域&#xff0c;从而避免数据传输时的 IO 操作&#xff0c;提高通信速度。通过共享内存&#xff0c;多个进程可以直接读写这块内存&#xff0c;而无需经过文件…

2024年3月全国计算机等级考试真题(二级C语言)

&#x1f600; 第1题 下列叙述中正确的是 A. 矩阵是非线性结构 B. 数组是长度固定的线性表 C. 对线性表只能作插入与删除运算 D. 线性表中各元素的数据类型可以不同 题目解析&#xff1a; A. 矩阵是非线性结构 错误。矩阵通常是二维数组&#xff0c;属…

基于Ebay拍卖网站成交价格的影响因素分析

摘要:近些年来网上拍卖的不断地发展&#xff0c;网上购物慢慢变成了大家普遍接受的购物方式。因此关于网上拍卖的研究日益成为很多人研究的重点。 影响拍卖网站价格的因素很多&#xff0c;但很少有人分得清楚哪些因素才是比较重要的因素&#xff0c;因此对价格因素分析&#x…

Langchain中的表格解析:RAG 和表格的爱恨情仇

实现 RAG(Retrieval-Augmented Generation)是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时。这在处理扫描文档或图像格式的文档时尤为困难。这些挑战至少包括以下三个方面: 1.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…

原生后台GPS位置限制,降低功耗

1.后台 GPS 位置限制的背景 为了控制功耗&#xff0c;Android 平台对后台应用获取位置信息的频率进行了限制。后台的定义与后台执行限制一致&#xff0c;即应用不在前台运行时被视为后台应用。 2.更新间隔限制&#xff1a; 后台应用获取位置信息的更新间隔不能超过一定阈值。…

Docker 搭建 PlantUML 服务:高效生成 UML 图的最佳实践

PlantUML 是一款开源的 UML 图形生成工具&#xff0c;它支持生成类图、时序图、用例图、活动图等多种类型的 UML 图&#xff0c;广泛应用于软件设计、文档编写以及团队沟通中。通过 Docker 安装 PlantUML&#xff0c;开发者可以快速搭建环境&#xff0c;轻松生成 UML 图&#x…

简鹿办公汇总快速打开 Windows 资源管理器的几种方式

无论你是刚开始使用电脑的新手&#xff0c;还是已经有一定经验的用户&#xff0c;了解如何在 Windows 系统中打开资源管理器都是一个非常基本且重要的技能。Windows 资源管理器&#xff08;现在称为“文件资源管理器”&#xff09;是帮助你浏览、查找和管理计算机上所有文件的主…

嵌入式 python 安装

下载嵌入式Python后解压 https://www.python.org/ftp/python/3.12.9/python-3.12.9-embed-amd64.zip cd python-3.12.9-embed-amd64 安装 pip .\python.exe .\get-pip.py 放开限制 嵌入式 Python 为了减少体积&#xff0c;默认会有一些限制。你需要编辑 python312._pth 文…

DeepSeek底层揭秘——GEMM

目录 1. 什么是 GEMM&#xff1f; (1) 定义 (2) 核心目标 2. 核心功能 3. 对比传统通用矩阵乘法库 4. 技术要素 (1) 硬件感知优化 (2) 自动调优 (3) 高效内存管理 (4) 混合精度计算 5. 难点挑战&#xff08;含解决方案&#xff09; 6. 技术路径 7. 具体技术实现 8…

DNA-PAINT

参考: 【科研教程】NUPACK网页版使用教程 https://www.bilibili.com/video/BV1G94y1W7mN/NUPACK新版网页版教程-模拟部分 https://zhuanlan.zhihu.com/p/678730568NUPACK 4.0 User Guide https://docs.nupack.org/NUPACK网页版使用指南 https://zhuanlan.zhihu.com/p/55024017…

小程序内表格合并功能实现—行合并

功能介绍&#xff1a;支付宝小程序手写表格实现行内合并&#xff0c;依据动态数据自动计算每次需求合并的值&#xff0c;本次记录行内合并&#xff0c;如果列内合并&#xff0c;同理即可实现 前端技术&#xff1a;grid布局 display&#xff1a;grid 先看实现效果: axml&…

计算机视觉cv2入门之角点检测

角点是指图像中两条边缘线的交点&#xff0c;这些交点通常代表了图像中的重要特征。在计算机视觉中&#xff0c;角点检测是一种关键的技术&#xff0c;它可以帮助我们从图像中提取出这些重要的特征点&#xff0c;进而用于图像匹配、物体识别、图像拼接等多种应用。 角点检测示例…

抽奖的诱惑系统注册与登录功能测试报告

目录 一&#xff1a;项目背景 二&#xff1a;项目功能 &#xff08;1&#xff09; 注册功能 &#xff08;2&#xff09; 登录功能 电话 密码登录 电话 短信登录 三&#xff1a;设计测试用例 四&#xff1a;功能测试 五&#xff1a;自动化测试代码 七&#xff1a;遗留风…

【多媒体交互】Unity Kinect实现UI控件的点击

在Unity中&#xff0c;通过Kinect实现UI控件的点击功能&#xff0c;主要涉及手部追踪、坐标映射和手势检测三个核心环节。 实现步骤 初始化Kinect与关节追踪 使用KinectManager获取用户ID和手部关节点&#xff08;如JointType.HandLeft&#xff09;的坐标。 long userId _…