java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot ThreadLocal保存信息

SpringBoot中的ThreadLocal保存请求用户信息的实例demo

作者:奋--斗

线程局部变量,创建一个线程变量后,针对这个变量可以让每个线程拥有自己的变量副本,每个线程是访问的自己的副本,与其他线程的相互独立,本文介绍SpringBoot中的ThreadLocal保存请求用户信息,需要的朋友可以参考下

一、ThreadLocal概述

线程局部变量,创建一个线程变量后,针对这个变量可以让每个线程拥有自己的变量副本,每个线程是访问的自己的副本,与其他线程的相互独立。

二、具体代码demo实现

(1)创建user实例对象

@Data
public class UserDTO {
    private Long userId;
    private String UserName;
}

(2)创建UserThreadLocal对象

public class UserThreadLocal {
    private UserThreadLocal(){};
    private static final ThreadLocal<UserDTO> USER_DTO_THREAD_LOCAL = new ThreadLocal<>();
    /**
     * 清除信息
     */
    public static void clear(){
        USER_DTO_THREAD_LOCAL.remove();
    }
    /**
     * 保存用户信息
     * @param userDTO
     */
    public static void set(UserDTO userDTO){
        USER_DTO_THREAD_LOCAL.set(userDTO);
    }
    public static UserDTO getCurrentUser(){
       return USER_DTO_THREAD_LOCAL.get();
    }
}

(3)创建用户拦截器

@Component
public class UserInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //此处实际应该根据header的token解析出用户本处为了简单,直接虚构一个用户
        UserDTO userDTo = new UserDTO();
        userDTo.setUserId(10001L);
        userDTo.setUserName("张三");
        UserThreadLocal.set(userDTo);
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserThreadLocal.clear();
    }
}

  (4) 注册用户拦截器

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInterceptor());
    }
}

(5)编写测试接口

@RequestMapping("test")
@RestController
public class TestController {

    @GetMapping("get")
    public UserDTO getUser(){
        UserDTO currentUser = UserThreadLocal.getCurrentUser();
        System.out.println(currentUser);
        return currentUser;
    }
}

(6)效果展示

localhost:8080/test/get

到此这篇关于SpringBoot之ThreadLocal保存请求用户信息的文章就介绍到这了,更多相关SpringBoot ThreadLocal保存请求用户信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文