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

【全栈】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; 【全栈】…...

统计5分钟nginx访问日志的数据并设置阈值告警

1.脚本统计生成deny_ip文件 #!/usr/bin/bash#Tate:2022.3.30 #Author:Yingjian #function: 统计5分钟之内的访问ip #env#脚本存放的目录 workdircd $(dirname $0);pwdif [ $# -eq 0 ];then echo "Usage: $0 {统计几分钟内的ip}" exit 2 filogfile/var/log/nginx/acc…...

用什么办法能实现ubuntu里面运行的自己开发的python程序能自动升级。

要实现Ubuntu中自己开发的Python程序自动升级&#xff0c;可以通过以下几种方式&#xff1a; 1. 使用 Git 仓库 定时任务 如果你的Python程序托管在Git仓库中&#xff0c;可以通过定时拉取最新代码来实现自动升级。 步骤&#xff1a; 确保Python程序在Git仓库中。在Ubuntu上…...

day12_调度和可视化

文章目录 day12_调度和可视化一、任务调度1、开启进程2、登入UI界面3、配置租户4、创建项目5、创建工作流5.1 HiveSQL部署&#xff08;掌握&#xff09;5.2 SparkDSL部署&#xff08;掌握&#xff09;5.3 SparkSQL部署&#xff08;熟悉&#xff09;5.4 SeaTunnel部署&#xff0…...

力扣第4题 寻找两个正序数组的中位数

力扣第4题 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.0000…...

DC-6靶机渗透测试全过程

目录 前期准备 一、渗透测试 1.IP地址查询 2.端口信息搜寻 3.网页信息搜集 wappalyzer WPScan 反弹shell graham用户 反弹出jens的shell nmap提权 二、总结 前期准备 攻击机&#xff1a; kali windows11 靶机&#xff1a;DC-6靶机&#xff08;调至NAT模式&#xff0…...

Win11 远程 连接 Ubuntu20.04(局域网)

Win11 远程 连接 Ubuntu20.04(局域网&#xff09; 0. Ubuntu 开启共享1. Ubuntu系统中安装RDP服务器2.windows中连接使用方式1&#xff1a;远程桌面连接(winr: mstsc)方式2&#xff1a;mobaXterm 3 问题远程连接后出现黑屏 参考文献: 0. Ubuntu 开启共享 在ubunt设置中&#x…...

探索Hugging Face:开源AI社区的核心工具与应用实践

引言&#xff1a;AI民主化的先锋 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Hugging Face已成为开源社区的代名词。这个成立于2016年的平台&#xff0c;通过提供易用的工具和丰富的预训练模型库&#xff0c;彻底改变了开发者使用和部署AI模型的方式。截至202…...

文件分片上传 python

服务端功能 上传分片保存 app.route(/upload_filesliceprocess, methods[POST]) def upload_filesliceprocess(): file request.files[file] name_index request.form[name_index] complete request.form[complete] process request.form[process] c…...

外汇掉期(FX Swap):全球企业管理外汇风险的关键工具(中英双语)

外汇掉期&#xff08;FX Swap&#xff09;&#xff1a;全球企业管理外汇风险的关键工具 引言 在全球化经济环境下&#xff0c;跨国公司、银行和金融机构经常面临外汇风险&#xff0c;因为它们的业务涉及多种货币。例如&#xff0c;一家中国公司可能需要欧元支付欧洲供应商&am…...

Visual Studio Code支持WSL,直接修改linux/ubuntu中的文件

步骤1 开始通过 WSL 使用 VS Code | Microsoft Learn 点击远程开发扩展包。 步骤2 Remote Development - Visual Studio Marketplace 点击install&#xff0c; 允许打开Visual Studio Code。 步骤3 共有4项&#xff0c;一齐安装。 步骤4 在WSL Linux(Ubuntu)中&#xf…...

网络安全“挂图作战“及其场景

文章目录 一、网络安全挂图作战来源与定义1、网络安全挂图作战的来源2、网络安全挂图作战的定义 二、挂图作战关键技术三、挂图作战与传统态势感知的差异四、挂图作战主要场景五、未来趋势结语 一、网络安全挂图作战来源与定义 1、网络安全挂图作战的来源 网络安全挂图作战的…...

开源在线考试系统开源在线考试系统:支持数学公式的前后端分离解决方案

开源在线考试系统&#xff1a;支持数学公式的前后端分离解决方案 项目介绍项目概述&#xff1a;技术栈&#xff1a;版本要求主要功能&#xff1a;特色亮点 项目仓库地址演示地址GiteeGitHub 系统效果展示教师端系统部分功能截图学生端系统部分功能截图 结语 项目介绍 项目概述…...

解决 ssh connect to host github.com port 22 Connection timed out

一、问题描述 本地 pull/push 推送代码到 github 项目报 22 端口连接超时&#xff0c;测试连接也是 22 端口连接超时 ssh 密钥没问题、也开了 Watt Toolkit 网络是通的&#xff0c;因此可以强制将端口切换为 443 二、解决方案 1、测试连接 ssh -T gitgithub.com意味着无法通…...

分享8款AI生成PPT的工具!含测评

随着人工智能技术的飞速进步&#xff0c;制作PPT变得愈发便捷&#xff0c;仅需输入主题指令&#xff0c;便能在瞬间获得一份完整的演示文稿。尤其在制作篇幅较长的PPT时&#xff0c;手动编写每一页内容并设计格式和排版&#xff0c;不仅效率低下&#xff0c;而且耗时耗力。 本…...

Java 设计模式总结

文章目录 Java 设计模式总结创建型模式&#xff08;5种&#xff09;结构型模式&#xff08;7种&#xff09;行为型模式&#xff08;11种&#xff09; Java 设计模式总结 设计模式&#xff08;Design Patterns&#xff09;是软件工程中解决常见问题的经典解决方案。它们提供了一…...

Spring Boot Actuator 监控✨

Spring Boot Actuator 是 Spring Boot 提供的一个强大的监控和管理工具&#xff0c;它可以帮助你深入了解和监控你的应用程序的运行状态。通过 Actuator&#xff0c;你可以获取应用程序的健康状况、内存使用情况、线程信息、HTTP 请求跟踪等。&#x1f680; 核心知识点 &#…...

解锁原型模式:Java 中的高效对象创建之道

系列文章目录 后续补充~~~ 文章目录 一、引言1.1 软件开发中的对象创建困境1.2 原型模式的登场 二、原型模式的核心概念2.1 定义与概念2.2 工作原理剖析2.3 与其他创建型模式的差异 三、原型模式的结构与角色3.1 抽象原型角色3.2 具体原型角色3.3 客户端角色3.4 原型管理器角色…...

23种设计模式 - 责任链

模式定义 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;允许多个对象按链式顺序处理请求&#xff0c;直到其中一个对象处理为止。该模式将请求的发送者和接收者解耦&#xff0c;使多个对象都有机会处理请求。 模式结构…...

【Linux-命令】

Linux-命令 ■ ls■ cd■ pwd■ tree■ mkdir■ rm■ mv■ cp■ chmod■ chattr 文件的特殊属性■ cat■ 日期■ 关机■ find■ 查看文件内容■ cat■ ln■ mount 挂载一个文件系统■ uname■ 用户和组■ 打包和压缩■ zip■ gzip■ rar■ tar ■ 包■ rpm 包■ yum 软件包升级…...

豪越科技:消防安全重点单位一体化安全管控

在当今数字化高速发展的时代&#xff0c;消防安全的重要性日益凸显。豪越科技以其卓越的技术实力和创新精神&#xff0c;将物联网、大数据、人工智能等先进技术深度融合&#xff0c;打造出了功能强大的消防安全重点单位一体化安全管控平台&#xff0c;为消防安全管理带来了全新…...

LabVIEW无刷电机控制器检测系统

开发了一种基于LabVIEW的无刷电机控制器检测系统。由于无刷电机具有高效率、低能耗等优点&#xff0c;在电动领域有取代传统电机的趋势&#xff0c;而无刷电机的核心部件无刷电机控制器产量也在不断增长。然而&#xff0c;无刷电机控制器的出厂检测仍处于半自动化状态&#xff…...

EXCEL解决IF函数“您已为此函数输入太多个参数”的报错

IF函数的基本结构是IF(条件, 值为真时的结果, 值为假时的结果)&#xff0c;所以标准的IF函数最多只能有三个参数。当用户输入的参数超过三个时&#xff0c;Excel就会报这个错误。比如多个IF语句叠加&#xff0c;但可能在嵌套的过程中没有正确关闭每个IF函数的括号&#xff0c;导…...

C#使用文件读写操作实现仙剑五前传称号存档修改

手把手教学仙剑五前传 称号存档修改器 首先找到 Pal5Q所在目录的save\global.sav 文件,这是一个只有488字节的文件,这里存放称号对应的编号ID,以及是否已获得该称号,1为已获取称号,0为未获取称号 [称号:是否获取]这是一个键值对 称号的编号ID是一个Int32数字,使用C#的方法Bi…...

Python 发布 Web 应用的常见方法及详细步骤

以下是 Python 发布 Web 应用的常见方法及详细步骤&#xff0c;涵盖从本地开发到生产环境部署的全流程&#xff1a; 一、基础准备&#xff1a;开发 Web 应用 1. 选择框架&#xff08;以 Flask 为例&#xff09; # app.py from flask import Flask app Flask(__name__)app.ro…...

记录一次部署PC端网址全过程

当我查看我之前写的文章时、顿时惊奇发出感慨&#xff1a;啥时候写的&#xff1f;是我写的么&#xff1f;疑惑重重… 所以说&#xff0c;好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步&#xff1a;第一步&#xff1a;申请域名并映射到外网IP &#xff0…...

Spring——Spring开发实战经验(4)

摘要 本文深入探讨了 Spring 应用中 Interceptor&#xff08;拦截器&#xff09;、Filter&#xff08;过滤器&#xff09;和 Aspect&#xff08;切面&#xff09;的执行顺序、职责及典型使用场景。Filter 是 Servlet 级别的机制&#xff0c;主要用于日志记录、权限验证等&…...

深入探索HarmonyOS——构建万物智联的新时代

作者&#xff1a;林钟雪 引言 在科技日新月异的今天&#xff0c;操作系统作为连接硬件与软件的核心桥梁&#xff0c;正引领着数字化转型的新浪潮。HarmonyOS&#xff0c;作为华为自主研发的面向万物智联时代的分布式全场景操作系统&#xff0c;自发布以来便备受瞩目。它不仅打…...

算法12-贪心算法

一、贪心算法概念 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致全局最优解的算法。贪心算法的核心思想是“局部最优&#xff0c;全局最优”&#xff0c;即通过一系列局部最优选择&#xff0c;最…...

小白win10安装并配置yt-dlp

需要yt-dlp和ffmpeg 注意存放路径最好都是全英文 win10安装并配置yt-dlp 一、下载1.下载yt-dlp2. fffmpeg下载 二、配置环境三、cmd操作四、yt-dlp下视频操作 一、下载 1.下载yt-dlp yt-dlp地址 找到win的压缩包点下载&#xff0c;并解压 2. fffmpeg下载 ffmpeg官方下载 …...