【SpringBoot】——如何在Spring Boot中使用ThreadLocal来存储和获取用户详情信息以及实体类参数验证

🎼个人主页:【Y小夜】

😎作者简介:一位双非学校的大二学生,编程爱好者,

专注于基础和实战分享,欢迎私信咨询!

🎆入门专栏:🎇【 MySQL,Java基础,Rust】

🎈热门专栏:🎊【 Python,Javaweb,Vue框架】

++感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️++

目录

🎯ThreadLocal

[😎如何在Spring Boot中使用ThreadLocal来存储和获取用户详情信息](#😎如何在Spring Boot中使用ThreadLocal来存储和获取用户详情信息)

🎃创建用户详情类

🎃使用拦截器或过滤器

🎃存储用户详情到ThreadLocal

🎃创建ThreadLocal存储类

🎃在Service中使用用户详情

🎃清除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
  • @Email
  • 接口方法的实体参数上添加@Validated注解

对于必须时URL地址的,可以在参数前面加上@URL

相关推荐
Cosolar25 分钟前
极简智库(MiniDocs):docsify、VitePress、Notion 等知识库搭建服务的完美替代
前端·后端·架构
Goboy41 分钟前
夯爆了,我被一个一句话接入的免费可观测平台策反了,那一刻我决定放弃用了3年的Prometheus
后端·docker·kubernetes
奶油话梅糖1 小时前
打开项目 0.9 秒、内存只有 IDEA 的 1/12:OpenIDEA 用 Rust 把 IntelliJ IDEA 重造了一遍
java·rust·github·intellij-idea
回家路上绕了弯1 小时前
Agent in the Sandbox:当 AI 有了自己的开发环境
后端
vipxieliang1 小时前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
陈随易1 小时前
TanStarter,从搭建到支付,一步到位开始赚美元
前端·后端·程序员
Rain的Java大神之路2 小时前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试
挖掘狂人2 小时前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
后端·sql·mysql
golang学习记2 小时前
IDEA 2026.3 远程开发迎来重磅升级
java·ide·intellij-idea·远程开发
天天被压力2 小时前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python