# java - ThreadLocal
# 介绍
在 Tomcat 中,每个请求都是一个线程,可以在该线程中存储一些数据
# 示例
说明:
- 在登录拦截器中 取出 Session 中的 user 存入 ThreadLocal ,后续可以直接从 ThreadLocal 中取 user
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1. 获取 session
HttpSession session = request.getSession();
// 2. 获取 session 中的用户
Object user = session.getAttribute("user");
// 3. 用户不存在,拦截 并返回 401 或抛异常
if (user == null) {
log.info("用户不存在");
response.setStatus(401);
return false;
}
// 4. 用户存在,存入 ThreadLocal
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
UserHolder.saveUser(userDTO);
// 5. 放行
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserHolder.removeUser();
}
}
public class UserHolder {
private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();
public static void saveUser(UserDTO user){
tl.set(user);
}
public static UserDTO getUser(){
return tl.get();
}
public static void removeUser(){
tl.remove();
}
}
@Data
public class UserDTO {
private Long id;
private String nickName;
private String icon;
}
上一篇: 下一篇:
本章目录