扁平 网站模板,WordPress文章底部广告插件,wordpress 商户插件,ui设计师导航网【全栈】SprintBootvue3迷你商城-细节解析#xff08;1#xff09;#xff1a;Token、Jwt令牌、Redis、ThreadLocal变量
往期的文章都在这里啦#xff0c;大家有兴趣可以看一下
后端部分#xff1a;
【全栈】SprintBootvue3迷你商城#xff08;1#xff09; 【全栈】…【全栈】SprintBootvue3迷你商城-细节解析1Token、Jwt令牌、Redis、ThreadLocal变量
往期的文章都在这里啦大家有兴趣可以看一下
后端部分
【全栈】SprintBootvue3迷你商城1 【全栈】SprintBootvue3迷你商城2 【全栈】SprintBootvue3迷你商城-扩展利用python爬虫爬取商品数据 【全栈】SprintBootvue3迷你商城3 【全栈】SprintBootvue3迷你商城4 【全栈】SprintBootvue3迷你商城5 【全栈】SprintBootvue3迷你商城6
前端部分
【全栈】SprintBootvue3迷你商城-扩展vue的基本用法
【全栈】SprintBootvue3迷你商城-扩展vue3项目创建及目录介绍
【全栈】SprintBootvue3迷你商城7
【全栈】SprintBootvue3迷你商城8
【全栈】SprintBootvue3迷你商城9
【全栈】SprintBootvue3迷你商城10 文章目录 【全栈】SprintBootvue3迷你商城-细节解析1Token、Jwt令牌、Redis、ThreadLocal变量1.是什么及其联系Token 和 JWT 令牌RedisThreadLocal 变量它们之间的联系 2.在该项目中的应用2.1.配置RedisJWT令牌以及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变量可用于保存当前请求上下文中的某些状态信息比如当前登录用户的详细信息等。这使得在整个请求生命周期内这些信息可以在任何地方方便地获取而不需要通过方法参数传递。
它们之间的联系
认证过程 用户登录成功后服务器生成一个JWT令牌并可能将其存储在Redis中为了便于管理和撤销然后将此JWT返回给客户端。 请求处理 当客户端发起请求时会携带JWT令牌。服务器接收到请求后首先从请求头中提取出JWT。接着服务器可能会先检查Redis来确认JWT是否有效如是否存在、是否已过期等。如果Redis中存在该JWT则继续处理请求否则可能需要重新登录或其他操作。 并发控制与安全性 在请求处理过程中为了保证线程安全可以使用ThreadLocal变量来保存一些临时性的状态信息比如当前请求解析出来的用户ID或者权限列表。这样做可以让这些信息在线程内部随时可用同时也避免了多线程环境下可能出现的数据竞争问题。 性能优化 使用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: localhostJWT令牌以及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(MapString, 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 MapString, 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中MapString, Object claims new HashMap();claims.put(id, u.getId());claims.put(username, username);String token JwtUtil.genToken(claims);ValueOperationsString, String operations stringRedisTemplate.opsForValue(); // redis模板接口operations.set(token,token,12, TimeUnit.HOURS); // 将token存储到redis中return Result.success(token);}return Result.error(密码错误!);}LoginInterceptor:
try {ValueOperationsString, String operations stringRedisTemplate.opsForValue();String redisToken operations.get(token);if (redisToken null) {throw new RuntimeException();}MapString, Object claims JwtUtil.parseToken(token);// 1.如果登录成功则将token里的信息存入ThreadLocal变量中以便后续使用ThreadLocalUtil.set(claims);return true;} catch (Exception e) {response.setStatus(401);return false;}}3.总结
本期为细节解析期的第一期补充了Token、Jwt令牌、Redis、ThreadLocal变量等细节下期将继续补充开发中的一些细节问题。