当前位置:网站首页>ThreedLocal在单线程中的应用【获取在拦截器中登录的用户信息】

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

2022-08-10 03:23:00 头顶凉凉先生丶

【项目】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();
    }
}
  • 拦截器中获取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();
    }
}
  • 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()); // 修改人
        }
原网站

版权声明
本文为[头顶凉凉先生丶]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_49904442/article/details/126257954