当前位置: 首页 > article >正文

【SpringBoot】ThreadLocal线程空间上下文使用

封装BaseContext操作的工具类

public class BaseContext {

    public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }

    public static Long getCurrentId() {
        return threadLocal.get();
    }

    public static void removeCurrentId() {
        threadLocal.remove();
    }

}

使用

    /**
     * 新增员工
     * @param employeeDTO
     */
    @Override
    public void save(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();

        // 对象属性拷贝
        BeanUtils.copyProperties(employeeDTO, employee);

        // 设置账号的状态,默认正常状态 1表示正常 0表示锁定(这一步可能是多余的,毕竟数据库中设置了默认值为1,待考察)
//        employee.setStatus(StatusConstant.ENABLE);

        // 设置密码,默认密码为123456(md5加密)
        employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));

        // 设置当前记录的创建时间和修改时间
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());

        // 设置当前记录创始人ID和修改人ID
        employee.setCreateUser(BaseContext.getCurrentId()); // TODO (已修改)创始人ID和修改人ID,目前写个假数据,后期修改
        employee.setUpdateUser(BaseContext.getCurrentId());

        // 插入!!
        employeeMapper.insert(employee);
    }

JWT拦截后进行校验过程中设置线程ID

@Component
@Slf4j
public class JwtTokenAdminInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtProperties jwtProperties;

    /**
     * 校验jwt
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断当前拦截到的是Controller的方法还是其他资源
        if (!(handler instanceof HandlerMethod)) {
            //当前拦截到的不是动态方法,直接放行
            return true;
        }

        //1、从请求头中获取令牌
        String token = request.getHeader(jwtProperties.getAdminTokenName());

        //2、校验令牌
        try {
            log.info("jwt校验:{}", token);
            Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
            Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());
            log.info("当前员工id:", empId);
            // 将用户ID存入ThreadLocal
            BaseContext.setCurrentId(empId);
            //3、通过,放行
            return true;
        } catch (Exception ex) {
            //4、不通过,响应401状态码
            response.setStatus(401);
            return false;
        }
    }
}


http://www.kler.cn/a/388095.html

相关文章:

  • GxtWaitCursor:Qt下基于RAII的鼠标等待光标类
  • AWS认证SAA-C0303每日一题
  • python购物计算 2024年6月青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析
  • 网络安全-蓝队基础
  • DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)
  • Vim9 语法高亮syntax 在指定的缓冲区和窗口执行命令
  • Linux:版本控制器git的简单使用+gdb/cgdb调试器的使用
  • 【国内中间件厂商排名及四大中间件对比分析】
  • MySQL 程序设计课程复习大纲
  • Spring面向切面编程
  • 第4章 分离数据和指令-Claude开发应用教程
  • 2024最新软件测试面试热点问题
  • Oh My Posh安装
  • 07 P1164 小A点菜
  • Docker在CentOS上的安装与配置
  • 初识Electron 进程通信
  • PGMP-串串01概述
  • 数据分析:微生物功能差异分析之Maaslin2
  • 5分钟科普:AI网关是什么?应用场景是什么?有没有开源的选择?
  • 【JAVA】java 企业微信信息推送
  • 8+ 典型分析场景,25+ 标杆案例,Apache Doris 和 SelectDB 精选案例集(2024版)电子版上线
  • Python酷库之旅-第三方库Pandas(204)
  • layui 文件上传前检查文件大小,后面再点上传出现重复提交的问题
  • 【图】图学习
  • 20241106软考架构-------软考案例12答案
  • SQL,力扣题目262,行程和用户