
🎼个人主页:【Y小夜】
😎作者简介:一位双非学校的大二学生,编程爱好者,
专注于基础和实战分享,欢迎私信咨询!
🎈热门专栏:🎊【 Python,Javaweb,Vue框架】
++感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️++

目录
[😎如何在Spring Boot中使用ThreadLocal来存储和获取用户详情信息](#😎如何在Spring Boot中使用ThreadLocal来存储和获取用户详情信息)
🎯ThreadLocal
它主要提供线程局部变量
- 用来存取数据: set()/get()
- 使用ThreadLocal存储的数据, 线程安全
ThreadLocal是Java中的一个类,它用于在每个线程中存储一个独立的变量副本。这样,每个线程都可以访问到自己的变量副本,而不会影响其他线程的变量值。ThreadLocal常用于实现线程安全的数据共享,例如数据库连接、Session管理等。

😎 如何在Spring Boot中使用ThreadLocal
来存储和获取用户详情信息
在Spring Boot应用程序中,ThreadLocal
通常用于存储线程局部变量,比如用户的上下文信息。当使用基于JWT的用户认证机制时,可以在用户登录成功后,将用户详情信息存储到ThreadLocal
中,以便在后续的请求中能够方便地获取用户信息。
🎃创建用户详情类
定义一个用户详情类,包含用户的属性和方法
🎃使用拦截器或过滤器
创建一个拦截器或过滤器来处理每个进入的请求。在拦截器中,从JWT中解析用户身份信息,并将用户详情存储到
ThreadLocal
中
🎃存储用户详情到ThreadLocal
在拦截器的preHandle
方法中,当验证JWT有效后,将用户详情存储到ThreadLocal
java
public class UserAuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
// 解析JWT并获取用户信息
UserDetails userDetails = parseJwt(token);
// 存储用户信息到ThreadLocal
UserContextHolder.set(userDetails);
}
return true;
}
}
🎃创建ThreadLocal存储类
创建一个ThreadLocal
存储类,用于在应用程序中方便地获取用户详情
java
public class UserContextHolder {
private static final ThreadLocal<UserDetails> contextHolder = new ThreadLocal<>();
public static void set(UserDetails userDetails) {
contextHolder.set(userDetails);
}
public static UserDetails get() {
return contextHolder.get();
}
public static void clear() {
contextHolder.remove();
}
}
🎃在Service中使用用户详情
在业务逻辑层(Service层)中,通过
UserContextHolder.get()
方法获取当前请求相关的用户详情。
🎃清除ThreadLocal
请求处理完成后,清除ThreadLocal
中存储的用户信息,防止内存泄漏。
java
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserContextHolder.clear();
}
🎃注册拦截器
将拦截器注册到Spring Boot应用程序中
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserAuthInterceptor());
}
}
- 使用
ThreadLocal
存储用户详情信息的方式,可以避免在每个方法调用中都通过参数传递用户信息,使得代码更加简洁。- 然而,需要注意的是,
ThreadLocal
的使用要谨慎,确保在请求结束时清除存储的信息,以避免内存泄漏问题。- 此外,
ThreadLocal
不适用于异步执行的线程,因为异步线程可能会复用同一个线程池中的线程。在这种情况下,可以考虑使用其他上下文传递机制。
🎯实体类参数验证
常用参数

java
@Data
public class User{
@NotNuLL
private Integer id;//主雠ID
private string username;//用户名
private string password;//密码
@NotEmpty
@Pattern(regexp ="\S{1,10]$")
private string nickname;//昵称
@NotEmpty
@Email
private string email;//邮箱
private String userpic;//用户头像地址
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime,//更新时间
}
java
@PutMapping("/update")
public Result update(@RequestBody @Validated User user){
userService.update(user);
return Result.success();
}
- 实体类的成员变量上添加注解
- @NotNull
- @NotEmpty
- 接口方法的实体参数上添加@Validated注解
对于必须时URL地址的,可以在参数前面加上@URL