SpringBoot之ThreadLocal保存請求用戶信息
一、ThreadLocal概述
線程局部變量,創(chuàng)建一個線程變量后,針對這個變量可以讓每個線程擁有自己的變量副本,每個線程是訪問的自己的副本,與其他線程的相互獨立。
二、具體代碼demo實現(xiàn)
(1)創(chuàng)建user實例對象
@Data public class UserDTO { private Long userId; private String UserName; }
(2)創(chuàng)建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)創(chuàng)建用戶攔截器
@Component public class UserInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //此處實際應(yīng)該根據(jù)header的token解析出用戶本處為了簡單,直接虛構(gòu)一個用戶 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)效果展示

古今成大事者,不唯有超世之才,必有堅韌不拔之志!

浙公網(wǎng)安備 33010602011771號