当前位置: 首页 > news >正文

【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量

【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量

往期的文章都在这里啦,大家有兴趣可以看一下

后端部分:

【全栈】SprintBoot+vue3迷你商城(1)
【全栈】SprintBoot+vue3迷你商城(2)
【全栈】SprintBoot+vue3迷你商城-扩展:利用python爬虫爬取商品数据
【全栈】SprintBoot+vue3迷你商城(3)
【全栈】SprintBoot+vue3迷你商城(4)
【全栈】SprintBoot+vue3迷你商城(5)
【全栈】SprintBoot+vue3迷你商城(6)

前端部分:

【全栈】SprintBoot+vue3迷你商城-扩展:vue的基本用法

【全栈】SprintBoot+vue3迷你商城-扩展:vue3项目创建及目录介绍

【全栈】SprintBoot+vue3迷你商城(7)

【全栈】SprintBoot+vue3迷你商城(8)

【全栈】SprintBoot+vue3迷你商城(9)

【全栈】SprintBoot+vue3迷你商城(10)

文章目录

  • 【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量
    • 1.是什么及其联系
      • Token 和 JWT 令牌
      • Redis
      • ThreadLocal 变量
      • 它们之间的联系
    • 2.在该项目中的应用
      • 2.1.配置
        • Redis
        • JWT令牌以及ThreadLocal工具类
    • 2.2.应用
    • 3.总结

1.是什么及其联系

Token、JWT令牌(JSON Web Token)、Redis和ThreadLocal变量在现代Web应用程序中常常被结合使用,尤其是在涉及用户认证与授权、会话管理以及并发处理等方面。下面解释它们之间的联系:

Token 和 JWT 令牌

  • Token:是一种用于标识用户身份的数据片段,通常是在用户成功登录后由服务器生成并返回给客户端。客户端随后会在每次请求时将这个token附带在请求头或请求参数中发送回服务器以证明其身份。
  • JWT (JSON Web Token):是一种特定类型的token格式,它允许你在一个紧凑且自包含的字符串中安全地传输信息作为JSON对象。JWT通常由三部分组成:Header(头部)、Payload(负载)和Signature(签名)。JWT可以用来存储用户的认证信息,并且由于其具备签名特性,接收方能够验证内容是否被篡改。

Redis

  • Redis:是一个开源的内存数据结构存储系统,常被用作数据库、缓存和消息中间件。在Web应用中,Redis可以用来存储session数据或JWT令牌,以便快速访问和验证。例如,当用户登录时,可以生成一个JWT并将之存储在Redis中,同时设置过期时间。这样,后续请求只需查询Redis即可验证token的有效性,而无需每次都查询数据库。

ThreadLocal 变量

  • ThreadLocal:提供线程局部变量,每个使用该变量的线程都会拥有独立的副本,从而避免了多线程环境下的资源共享问题。在Web应用中,ThreadLocal变量可用于保存当前请求上下文中的某些状态信息,比如当前登录用户的详细信息等。这使得在整个请求生命周期内,这些信息可以在任何地方方便地获取,而不需要通过方法参数传递。

它们之间的联系

  1. 认证过程
    • 用户登录成功后,服务器生成一个JWT令牌,并可能将其存储在Redis中(为了便于管理和撤销),然后将此JWT返回给客户端。
  2. 请求处理
    • 当客户端发起请求时,会携带JWT令牌。服务器接收到请求后,首先从请求头中提取出JWT。
    • 接着,服务器可能会先检查Redis来确认JWT是否有效(如是否存在、是否已过期等)。如果Redis中存在该JWT,则继续处理请求;否则,可能需要重新登录或其他操作。
  3. 并发控制与安全性
    • 在请求处理过程中,为了保证线程安全,可以使用ThreadLocal变量来保存一些临时性的状态信息,比如当前请求解析出来的用户ID或者权限列表。这样做可以让这些信息在线程内部随时可用,同时也避免了多线程环境下可能出现的数据竞争问题。
  4. 性能优化
    • 使用Redis存储JWT令牌可以显著提高验证速度,因为Redis是基于内存的存储系统,查找速度远快于传统的数据库查询。
    • ThreadLocal变量则有助于减少不必要的对象传递,简化代码逻辑,特别是在复杂的业务场景下,能有效地提升开发效率和程序执行效率。

所以,Token(特别是JWT)用于用户的身份验证和授权,Redis用于高效地存储和检索这些令牌,而ThreadLocal变量则为单个请求线程提供了便捷的状态管理方式。三者结合起来,可以构建既安全又高效的Web服务架构。

2.在该项目中的应用

2.1.配置

使用它们之前首先要去配置它们,我们在application.yml进行Redis的配置,然后编写JWT令牌以及ThreadLocal的工具类

Redis
# application.yml
spring:data:redis:port: 6379host: localhost
JWT令牌以及ThreadLocal工具类

JwtUtil:

// JwtUtilpackage com.janium.minimallbe.utils;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;import java.util.Date;
import java.util.Map;public class JwtUtil {private static final String KEY = "itheima";//接收业务数据,生成token并返回public static String genToken(Map<String, Object> claims) {return JWT.create().withClaim("claims", claims).withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12)).sign(Algorithm.HMAC256(KEY));}//接收token,验证token,并返回业务数据public static Map<String, Object> parseToken(String token) {return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("claims").asMap();}}

ThreadLocalUtil:

package com.janium.minimallbe.utils;/*** ThreadLocal 工具类*/
@SuppressWarnings("all")
public class ThreadLocalUtil {//提供ThreadLocal对象,private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();//根据键获取值public static <T> T get(){return (T) THREAD_LOCAL.get();}//存储键值对public static void set(Object value){THREAD_LOCAL.set(value);}//清除ThreadLocal 防止内存泄漏public static void remove(){THREAD_LOCAL.remove();}
}

2.2.应用

我们登录时应该生成一个token,而生成token可以交给Jwt工具类,然后我们需要将生成的token储存在redis中。而且,为了方便直接获取到用户Id等信息,我们可以将token中的信息存储到ThreadLocal变量中。

UserController:

@PostMapping("/login")public Result login(@Pattern(regexp = "^\\S{6,18}$") String username,@Pattern(regexp = "^\\S{6,18}$") String password){User u = userService.findByName(username);if(u == null){return Result.error("用户名错误");}if (u.getPassword().equals(Md5Util.getMD5String(password))) {// 1.设置token并将其储存到redis中Map<String, Object> claims = new HashMap<>();claims.put("id", u.getId());claims.put("username", username);String token= JwtUtil.genToken(claims);ValueOperations<String, String> operations = stringRedisTemplate.opsForValue(); // redis模板接口operations.set(token,token,12, TimeUnit.HOURS); // 将token存储到redis中return Result.success(token);}return Result.error("密码错误!");}

LoginInterceptor:

try {ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();String redisToken = operations.get(token);if (redisToken == null) {throw new RuntimeException();}Map<String, Object> claims = JwtUtil.parseToken(token);// 1.如果登录成功则将token里的信息存入ThreadLocal变量中,以便后续使用ThreadLocalUtil.set(claims);return true;} catch (Exception e) {response.setStatus(401);return false;}}

3.总结

本期为细节解析期的第一期,补充了TokenJwt令牌、RedisThreadLocal变量等细节,下期将继续补充开发中的一些细节问题。

相关文章:

【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量

【全栈】SprintBootvue3迷你商城-细节解析&#xff08;1&#xff09;&#xff1a;Token、Jwt令牌、Redis、ThreadLocal变量 往期的文章都在这里啦&#xff0c;大家有兴趣可以看一下 后端部分&#xff1a; 【全栈】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全栈】…...

基于ffmpeg+openGL ES实现的视频编辑工具(一)

在深入钻研音视频编辑开发这片技术海洋时&#xff0c;相信不少开发者都和我有同样的感受&#xff1a;网络上关于音视频编辑工具实现的资料繁多&#xff0c;理论阐释细致入微&#xff0c;代码片段也随处可见。然而&#xff0c;一个显著的缺憾是&#xff0c;缺乏一个完整成型的 A…...

面试完整回答:SQL 分页查询中 limit 500000,10和 limit 10 速度一样快吗?

首先&#xff1a;在 SQL 分页查询中&#xff0c;LIMIT 500000, 10 和 LIMIT 10 的速度不会一样快&#xff0c;以下是原因和优化建议&#xff1a; 性能差异的原因 LIMIT 10&#xff1a; 只需要扫描前 10 条记录&#xff0c;然后返回结果。 性能非常高&#xff0c;因为数据库只…...

Linux系统管理(十六)——通过WSL配置windows下的Linux系统(可视化界面与远程连接)

前言 WSL&#xff0c;即Windows Subsystem for Linux&#xff0c;是微软在Windows 10和Windows 11中引入的功能&#xff0c;允许用户在Windows上原生运行Linux的命令行工具和应用程序&#xff0c;无需启动完整的Linux虚拟机或进行双系统启动。 开启WSL服务 开启虚拟化 进入…...

【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?

在分布式系统中&#xff0c;RabbitMQ 自身不直接提供消息幂等性保障机制&#xff0c;但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践&#xff1a; 一、消息唯一标识符 (Message Deduplication) 原理 每条消息携带全局唯一ID&#xff…...

flutter在安卓模拟器上运行

目录 下载android studio&#xff0c;然后把其中的模拟器设为环境变量&#xff0c;然后在vscode/cursor中使用插件&#xff0c;打开安卓模拟器一、下载android studio网址mac 下载64位 ARM 二、启动android studio三、设置SDK四、打开文件 打开模拟器五、运行程序六、在vscode/…...

linux shell 当命令执行出现错误立即退出的方法

在 Linux 脚本中&#xff0c;如果你想在整个脚本执行完毕后检查是否有错误发生&#xff0c;可以通过以下几种方式实现&#xff1a; 1. 使用 $? 检查上一条命令的退出状态 每个命令执行后&#xff0c;Shell 会将其退出状态存储在特殊变量 $? 中。$? 的值为 0 表示成功&#…...

与本地电脑PDF文档对话的PDF问答程序

文章目录 PDF问答程序程序流程处理PDF文档创建问答链 在探索和学习新技术时&#xff0c;了解LangChain框架的理论知识固然重要&#xff0c;但实际的案例分析与实践尝试能为你提供更加直观的认识和更深人的理解。本文主要以解析案例代码为主。通过具体的实践操作&#xff0c;你可…...

QT之改变鼠标样式

QT改变鼠标图片 资源路径如下 代码实现 QPixmap customCursorPixmap(":/images/mouse.png");QCursor customCursor(customCursorPixmap);QWidget::setCursor(customCursor); // 可以设置为整个窗口或特定控件QWidget::setCursor(); // 设置为透明光标&#xff0c…...

后端开发:开启技术世界的新大门

在互联网的广阔天地中&#xff0c;后端开发宛如一座大厦的基石&#xff0c;虽不直接与用户 “面对面” 交流&#xff0c;却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域&#xff0c;负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…...

Sun-Panel:简洁且美观的导航首页开源项目!!

在这个数字化飞速发展的时代&#xff0c;我们几乎每个人都拥有自己的服务器或者NAS。但问题来了&#xff0c;管理这些设备往往需要记住一大堆复杂的命令和界面&#xff0c;对于像了不起这样追求简洁生活的程序员来说&#xff0c;简直是噩梦&#xff01; 今天介绍一款界面清爽&…...

第4章 信息系统架构(四)

4.6 网络架构 网络是信息技术架构中的基础&#xff0c;不仅是用户请求和获取IT信息资源服务的通道&#xff0c;同时也是 信息系统架构中各类资源融合和调度的枢纽。特别是云计算、大数据和移动互联网技术飞速发 展的今天&#xff0c;网络更加成为实现这些技术跨越的重要环节。…...

【Java八股文】07-Redis面试篇

【Java八股文】07-Redis面试篇 Redis面试篇认识redis为什么用 Redis 作为 MySQL 的缓存&#xff1f; 数据结构讲一下Redis底层的数据结构ZSet底层是由什么实现的 线程模型Redis 是单线程吗&#xff1f;Redis怎么进行I/O多路复用的&#xff1f;Redis 采用单线程为什么还这么快&a…...

Windows PyCharm的python项目移动存储位置后需要做的变更

项目使用的venv虚拟环境&#xff0c;因此项目移动存储位置后需要重新配置python解释器的位置&#xff0c;否则无法识别&#xff0c;若非虚拟环境中运行&#xff0c;则直接移动后打开即可&#xff0c;无需任何配置。 PyCharm版本为2021.3.3 (Professional Edition)&#xff0c;其…...

微信小程序消息推送解密

package com.test.main.b2b;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Arrays;/*** author * version 1.0* description: 解谜微信小…...

《道德经的现代智慧:解码生活与商业的底层逻辑2》

第二章&#xff1a;人际互动的智慧 &#x1f91d; 引言&#xff1a;现代人际关系的困境 &#x1f31f; 时代背景&#xff1a;超连接时代的人际迷思 &#x1f310; 在这个前所未有的超连接时代&#xff0c;我们似乎比任何时候都更"在线"、更"联系"&#…...

通过监督微调提升多语言大语言模型性能

引言 澳鹏助力一家全球科技公司提升其大语言模型&#xff08;LLM&#xff09;的性能。通过提供结构化的人工反馈形式的大语言模型训练数据&#xff0c;让该模型在30多种语言、70多种方言中的表现得到优化。众包人员们进行多轮对话&#xff0c;并依据回复的相关性、连贯性、准确…...

用deepseek学大模型05逻辑回归

deepseek.com:逻辑回归的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xff0c;及如何改进解决及改进方法数据推导。…...

图解循环神经网络(RNN)

目录 1.循环神经网络介绍 2.网络结构 3.结构分类 4.模型工作原理 5.模型工作示例 6.总结 1.循环神经网络介绍 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种专门用于处理序列数据的神经网络结构。与传统的神经网络不同&#xff0c…...

vue文件没有name属性怎么被调用

如果你在 index.vue 文件中定义了一个组件&#xff0c;但没有在组件定义中使用 name 属性&#xff0c;你仍然可以通过几种方式来引用和使用这个组件。 1. 使用局部注册 在父组件中直接导入并注册 index.vue 中的组件&#xff08;index.vue没有name属性&#xff09;&#xff0…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...