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

🎼个人主页:【Y小夜】

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

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

🎆入门专栏:🎇【 MySQLJava基础Rust

🎈热门专栏:🎊【 PythonJavawebVue框架

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

目录

🎯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

相关推荐
刘一说4 分钟前
CentOS 系统 Java 开发测试环境搭建手册
java·linux·运维·服务器·centos
Victor3569 分钟前
Redis(14)Redis的列表(List)类型有哪些常用命令?
后端
Victor35610 分钟前
Redis(15)Redis的集合(Set)类型有哪些常用命令?
后端
卷福同学11 分钟前
来上海三个月,我在马路边上遇到了阿里前同事...
java·后端
bingbingyihao2 小时前
多数据源 Demo
java·springboot
在努力的前端小白7 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
bobz9659 小时前
小语言模型是真正的未来
后端
一叶飘零_sweeeet9 小时前
从繁琐到优雅:Java Lambda 表达式全解析与实战指南
java·lambda·java8
DevYK9 小时前
企业级 Agent 开发实战(一) LangGraph 快速入门
后端·llm·agent
艾伦~耶格尔10 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试