ThreadLocal+拦截器+JWT项目技术复习

项目技术的复习

GPT解释:
ThreadLocal 是 Java 中的一个特殊类,它提供了线程局部变量的机制。通过 ThreadLocal,可以在每个线程中创建一个独立的变量副本,而不是共享同一个变量。这样做的好处是每个线程都可以独立地操作自己的变量副本,不会受其他线程影响,从而实现了线程之间的数据隔离。

从表面上看,ThreadLocal 和线程池(ThreadPool)两者是完全不同的概念:

ThreadLocal:

ThreadLocal 是一个类,用于在每个线程中创建独立的变量副本。它通常用于解决多线程环境下共享变量的线程安全问题,每个线程都可以通过 ThreadLocal 访问自己的变量副本,而不会影响其他线程。
线程池(ThreadPool):

线程池是一种线程管理机制,用于管理和复用线程。它可以在程序启动时创建一定数量的线程,并维护一个线程池,根据需要动态调整线程数量。通过线程池,可以有效地控制线程的数量,提高程序的性能和资源利用率。
虽然 ThreadLocal 和线程池是两个不同的概念,但它们在多线程编程中都有重要的作用。ThreadLocal 可以用于实现线程间的数据隔离,而线程池则可以用于管理和复用线程,提高程序的性能和效率。

创建TheadLoacl类

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

在这里插入图片描述
这边是登陆的ThreadLocal,前期在token的时候已经将对象放进来了,如果对象为空,说明没有通过验证,就返回false,401报错。

依赖注入

@Autowired 注解是 Spring 框架中用于自动装配依赖项的注解之一。它可以应用于字段、构造函数、Setter 方法或者配置方法上,告诉 Spring 在运行时将相应类型的 bean 注入到标记的字段或方法中。

字段注入:当 @Autowired 注解应用于字段时,Spring 将尝试查找并将匹配类型的 bean 自动注入到字段中。示例:
java
@Autowired
private MyService myService;
构造函数注入:将 @Autowired 注解应用于构造函数上,Spring 将会在创建 bean 实例时通过构造函数注入所需的依赖项。示例:
java
@Autowired
public MyClass(MyService myService) {
this.myService = myService;
}
Setter 方法注入:将 @Autowired 注解应用于 Setter 方法上,Spring 将会在创建 bean 实例后调用相应的 Setter 方法,将依赖项注入到目标对象中。示例:
java
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
配置方法注入:将 @Autowired 注解应用于配置方法上,Spring 将会在 bean 实例化后自动调用该方法,并将相应的依赖项注入到方法的参数中。示例:
java
@Autowired
public void configureService(MyService myService) {
this.myService = myService;
}
使用 @Autowired 注解时,Spring 将会根据类型进行自动装配。如果存在多个匹配类型的 bean,Spring 将会抛出异常,除非使用 @Qualifier 注解指定要注入的 bean 的名称。此外,如果希望某个依赖项可以为空,可以结合 @Autowired 和 @Nullable 注解使用,以允许依赖项为 null。

项目代码分析:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
每一次请求都需要经过登陆的验证,结束的时候需要将ThreadLocal里面的变量给清除掉。

工具类JWT

GPT解释JWT的格式:

JWT(JSON Web Token)是一种用于在网络应用间传递信息的简洁、自包含的安全方式。它使用 JSON 对象作为令牌的数据载荷,并使用数字签名(或者 HMAC 算法)来验证其真实性和完整性。JWT 可以在请求头、URL 参数或者 POST 请求体中传递,通常被用于实现身份验证和信息交换。

JWT 由三部分组成,分别是 Header(头部)、Payload(载荷)和 Signature(签名),它们通过.分隔组成了一个完整的 JWT。每部分的详细信息如下:

Header(头部):包含了两部分信息,分别是令牌类型(即 JWT)和所使用的加密算法(比如 HMAC SHA256 或者 RSA)。例如:

{
“alg”: “HS256”,
“typ”: “JWT”
}
Payload(载荷):包含了一些声明(claims),它们是关于实体(通常是用户)和其他数据的声明。有三种类型的声明:注册声明、公共声明和私有声明。例如:

{
“sub”: “1234567890”,
“name”: “John Doe”,
“admin”: true
}
Signature(签名):使用指定的算法对 Header 和 Payload 进行签名,以确保令牌在传输过程中没有被篡改。签名的生成方式取决于头部中指定的算法,通常是将编码后的 Header、Payload 和密钥一起进行签名。例如:

HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
secret)
JWT 的优点包括:

跨平台和语言:JWT 是基于 JSON 的标准,因此易于在不同的平台和语言之间传递和解析。
无状态性:JWT 包含了所有需要的信息,因此服务端不需要保存会话信息,使得服务端更容易水平扩展。
安全性:JWT 使用签名进行验证,可以确保令牌在传输过程中没有被篡改。
然而,JWT 也有一些缺点,比如一旦签发,令牌就无法撤销或者刷新,如果令牌被盗用,可能会导致安全漏洞。因此,在使用 JWT 时,需要谨慎处理敏感信息,并定期更换密钥以提高安全性。

JWT令牌代码


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 = "xinMiaoTongXue"; // 令牌加密密钥字符串
    //接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        return JWT.create()
                .withClaim("claims", claims) // 设置令牌承载数据
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12)) // 设置令牌失效时间 12h
                .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();
    }
}

在token拦截器里面将信息加入到threadlocal里面,调用JSONUtil的工具类将信息转为对应的实体对象
在这里插入图片描述

JSONUtil:

JSONUtil 是一个常见的用于处理 JSON 数据的 Java 工具类。虽然 Java 中有一些内置的 JSON 处理库(如 Gson、Jackson),但是有时候需要更简洁、更方便的方式来处理 JSON 数据,这时就可以使用 JSONUtil。

JSONUtil 主要提供了一系列静态方法,用于解析 JSON 数据、构建 JSON 对象、进行 JSON 字符串的转换等操作。常见的方法包括:

解析 JSON 字符串:可以将 JSON 字符串解析为 Java 对象或者 Map。例如:

java
JSONObject jsonObject = JSONUtil.parseObj(jsonString);
构建 JSON 对象:可以根据 Java 对象或者 Map 构建 JSON 对象。例如:

java
JSONObject jsonObject = JSONUtil.parseObj(user);
获取 JSON 对象中的值:可以根据键获取 JSON 对象中的值。例如:

java
String name = jsonObject.getStr(“name”);
设置 JSON 对象中的值:可以设置 JSON 对象中某个键的值。例如:

java
jsonObject.set(“age”, 30);
JSON 字符串转换:可以将 JSON 对象或者 Map 转换为 JSON 字符串。例如:

java
String jsonString = JSONUtil.toJsonStr(jsonObject);
JSON 格式化:可以对 JSON 字符串进行格式化,使其具有更好的可读性。例如:

java
String formattedJsonString = JSONUtil.formatJsonStr(jsonString);
深拷贝:可以对 JSON 对象进行深度拷贝,避免引用关系导致的数据修改问题。例如:

java
JSONObject copy = JSONUtil.parseObj(jsonObject);
JSONUtil 提供了简洁方便的 API,使得在处理 JSON 数据时更加轻松。它通常适用于简单的 JSON 数据处理场景,如果需要更复杂的功能(如自定义序列化、反序列化),则建议使用更专业的 JSON 处理库。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要打 Acm 的小周同学呀

您的支持是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值