ThreadLocal

简介: ThreadLocal

只有利害关系和出众的才干,才能帮你出起主意来,才认真细到,眼光透彻。——巴尔扎克

我们在web开发中经常遇到在一个线程中需要共享变量

这里就可以使用ThreadLocal去完成

例如我们用户发起请求,我们在过滤器等将用户信息存储在ThreadLocal中,这样在代码中获取用户信息就相对容易

写法如下:

import cn.hutool.core.lang.Opt;
/**
 * 用户工具类
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/8/25 12:10
 */
public class UserUtils {
    private static final ThreadLocal<UserDetail> USER_THREAD = new ThreadLocal<>();
    /**
     * 设置当前用户
     *
     * @param userDetail 用户信息
     * @author <achao1441470436@gmail.com>
     * @since 2021/9/10 16:23
     */
    public static void setUser(UserDetail userDetail) {
        USER_THREAD.set(userDetail);
    }
    /**
     * 移除当前用户
     *
     * @author <achao1441470436@gmail.com>
     * @since 2021/10/22 16:49
     */
    public static void clear() {
        USER_THREAD.remove();
    }
    /**
     * 获取用户信息,有可能获取不到
     *
     * @return com.baomidou.shaun.core.profile.TokenProfile
     * @author <achao1441470436@gmail.com>
     * @since 2021/9/9 10:33
     */
    public static Opt<UserDetail> getUser() {
        return Opt.ofNullable(USER_THREAD.get()).or(() -> {
            // 这里UserDetail从实际登录框架调用对应api获取
            UserDetail userDetail = null;
            return Opt.of(userDetail);
        });
    }
}


在拦截器中:

package com.ruben.xchat.interceptor;
import com.ruben.xchat.utils.UserUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 用户信息拦截器
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/22 19:19
 */
@Component
public class UserInfoInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        UserUtils.getUser().ifPresent(UserUtils::setUser);
        return true;
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserUtils.clear();
    }
}

然后别忘了让拦截器生效

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Resource
    private UserInfoInterceptor userInfoInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userInfoInterceptor).addPathPatterns("/**");
    }
}
相关文章
|
5月前
|
存储 Java
ThreadLocal应用及理解
ThreadLocal应用及理解
48 10
|
存储 Java
ThreadLocal
ThreadLocal字面意思本地线程,ThreadLocal使每个线程之间是隔离的,数据是独立的,我们使用过session都知道 session是一个会话,我们可以用它来存储一些用户的基本信息,这样每个用户在服务端都能取到,ThreadLocal也可以做到, ThreadLocal将相应的信息存储在当前的线程中,只有当前线程能够访问,其他线程不能访问,其实ThreadLocal 可以说是一个定制化的Map。
63 0
|
缓存 安全 Java
浅谈ThreadLocal
浅谈ThreadLocal
153 0
|
存储 Java
|
存储 Java 数据库连接
对ThreadLocal的一点了解
ThreadLocal是线程变量,它为每个线程提供单独的存储空间。其主要作用是做线程间的数据隔离,也可以用于在同一个线程间方便地进行数据共享。(对于多线程资源共享,加锁机制采用“时间换空间”,ThreadLocal采用“空间换时间”)
131 0
|
存储 分布式计算 安全
什么是ThreadLocal?
这篇文章是慕课网上一门免费课程《ThreadLocal》的观后总结。这门课将ThreadLocal讲得非常清晰易懂,又深入底层原理和设计思想,是我看过的最好的ThreadLocal的资料,现在把用自己的话,把它整理成文字版本。 总共预计产出四篇文章,这是第一篇。
270 3
|
存储 Java
ThreadLocal相关使用
ThreadLocal相关使用
199 0
ThreadLocal相关使用
|
存储 安全 Java
ThreadLocal 使用详解
ThreadLocal 是线程本地变量。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程
557 0
下一篇
DataWorks