• ThreedLocal在单线程中的应用【获取在拦截器中登录的用户信息】


    【项目】ThreedLocal在单线程中的应用【获取在拦截器中登录的用户信息】

    1、ThreadLocal概述
    • ThreadLocal类用来提供线程内部的局部变量,不同的线程之间不会相互干扰
    • 这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量
    • 在线程的生命周期内起作用,可以减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度
    2、常用方法
    方法名描述
    ThreadLocal()创建ThreadLocal对象
    public void set( T value)设置当前线程绑定的局部变量
    public T get()获取当前线程绑定的局部变量
    public T remove()移除当前线程绑定的局部变量,该方法可以帮助JVM进行GC
    protected T initialValue()返回当前线程局部变量的初始值
    3、案例

    获取放在Session中登录用户、方便业务操作获取。【日志、数据添加修改操作者等】

    • 自定义静态线程容器
    package com.itcast.utils;
    
    import com.itcast.domain.User;
    
    /**
     * @author : Maxim
     * @date : 2022-04-01 14:37
     * @description :
     * 获取登录信息的线程容器
     **/
    
    public class AppThreadLocal {
        private static ThreadLocal tl = new ThreadLocal();
        //GET
        public static User get() {
            return (User) tl.get();
        }
        //SET
        public static void set(User value) {
            tl.set(value);
        }
        //REMOVE
        public static void remove() {
            tl.remove();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 拦截器中获取Session域中的用户对象
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.itcast.domain.Employee;
    import com.itcast.utils.Constant;
    import com.itcast.utils.LoginThreadLocal;
    import com.itcast.utils.ResultInfo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /**
     * @author : Maxim
     * @date : 2022-05-29 16:39
     * @description :
     * 注册拦截
     **/
    @Component
    @Slf4j
    public class LogInterceptor implements HandlerInterceptor {
    
        //前置拦截
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            //从Session中获取登录对象判断.
            HttpSession session = request.getSession();
            Employee logObj = (Employee) session.getAttribute(Constant.SESSION_EMPLOYEE);
            if (logObj == null) {
                //返回给前端msg 携带信息. 这里没办法返回值的方式给前端. 所以我们需要将对象转化成Json数据传递.
                ResultInfo notlogin = ResultInfo.error("NOTLOGIN");//前端固定
                ObjectMapper objectMapper = new ObjectMapper();
                String json = objectMapper.writeValueAsString(notlogin);
                response.getWriter().write(json);
                return false;
            }
            /**
             * 将对象交给线程池、保证在本线程内该对象的属性可以被访问。
             * */
            LoginThreadLocal.set(logObj);
            return true;
        }
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            /**
             * 在全部业务结束后、需要对线程容器进行一下关闭。提高资源的利用率
             * */
            LoginThreadLocal.remove();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • ThreadLocal内部内容的使用案例

    获取修改插入数据的对应用户

            Employee employee = LoginThreadLocal.get();
            metaObject.setValue("createTime", new Date());
            metaObject.setValue("updateTime", new Date());
    
            if (employee != null) {
                metaObject.setValue("createUser", employee.getId()); // 创建人
                metaObject.setValue("updateUser", employee.getId()); // 修改人
            }
            User user = AppThreadLocal.get();
            if (user != null) {
                metaObject.setValue("createUser", user.getId()); // 创建人
                metaObject.setValue("updateUser", user.getId()); // 修改人
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    Armv8/Armv9 Cache知识大纲分享--思维导图
    浏览器基本原理
    校园安防监控系统升级改造方案:如何实现设备利旧上云与AI视频识别感知?
    代码大全阅读随笔(四)
    groovy在SpringBoot中的使用
    用ARM进行汇编语言编程(5) 使用链接寄存器进行分支并返回和从堆栈内存中保存和检索数据
    图解LeetCode——1710. 卡车上的最大单元数(难度:简单)
    计算机毕业设计JavaWeb商铺租赁管理系统(源码+系统+mysql数据库+lw文档)
    jq源码解析之绑在$,jQuery上面的方法
    10 特征向量与特征值
  • 原文地址:https://blog.csdn.net/weixin_49904442/article/details/126257954