首页 > 其他分享 >线程变量-cnblog

线程变量-cnblog

时间:2023-02-04 17:15:09浏览次数:39  
标签:变量 登录 用户 id ThreadLocal 线程 BaseContext cnblog

1.3.2 ThreadLocal

ThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问当前线程对应的值。

ThreadLocal常用方法:

A. public void set(T value) : 设置当前线程的线程局部变量的值

B. public T get() : 返回当前线程所对应的线程局部变量的值

C. public void remove() : 删除当前线程所对应的线程局部变量的值

我们可以在LoginCheckFilter的doFilter方法中获取当前登录用户id,并调用ThreadLocal的set方法来设置当前线程的线程局部变量的值(用户id),然后在MyMetaObjectHandler的updateFill方法中调用ThreadLocal的get方法来获得当前线程所对应的线程局部变量的值(用户id)。 如果在后续的操作中, 我们需要在Controller / Service中要使用当前登录用户的ID, 可以直接从ThreadLocal直接获取。

1.3.3 操作步骤

实现步骤:

1). 编写BaseContext工具类,基于ThreadLocal封装的工具类

2). 在LoginCheckFilter的doFilter方法中调用BaseContext来设置当前登录用户的id

3). 在MyMetaObjectHandler的方法中调用BaseContext获取登录用户的id

1.3.4 代码实现

1). BaseContext工具类

所属包: com.itheima.reggie.common

/**
 * 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
    /**
     * 设置值
     * @param id
     */
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }
    /**
     * 获取值
     * @return
     */
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

2).LoginCheckFilter中存放当前登录用户到ThreadLocal

在doFilter方法中, 判定用户是否登录, 如果用户登录, 在放行之前, 获取HttpSession中的登录用户信息, 调用BaseContext的setCurrentId方法将当前登录用户ID存入ThreadLocal。

Long empId = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
image-20210801162053581

3). MyMetaObjectHandler中从ThreadLocal中获取

将之前在代码中固定的当前登录用户1, 修改为动态调用BaseContext中的getCurrentId方法获取当前登录用户ID

image-20210801162345846 image-20210801162436740

1.3.5 功能测试

完善了元数据对象处理器之后,我们就可以重新启动项目,完成登录操作后, 在员工管理模块中,测试增加/更新员工信息功能, 直接查询数据库数据变更,看看我们在新增/修改数据时,这些公共字段数据是否能够完成自动填充, 并且看看填充的create_user 及 update_user字段值是不是本地登录用户的ID。

标签:变量,登录,用户,id,ThreadLocal,线程,BaseContext,cnblog
From: https://www.cnblogs.com/lingxin1123/p/17091899.html

相关文章

  • spring-data-redis-cnblog
    5.3SpringDataRedis5.3.1介绍SpringDataRedis是Spring的一部分,提供了在Spring应用中通过简单的配置就可以访问Redis服务,对Redis底层开发包进行了高度封装......
  • number类型id和String类型id处理-cnblog
    4.4功能测试代码编写完毕之后,我们需要将工程重启。然后访问前端页面,进行"启用"或"禁用"的测试。测试过程中没有报错,但是功能并没有实现,查看数据库中的数据也没有......
  • 事务管理-cnblog
    4).DishServiceImpl中实现方法saveWithFlavor页面传递的菜品口味信息,仅仅包含name和value属性,缺少一个非常重要的属性dishId,所以在保存完菜品的基本信息后,我们需要获......
  • 全局异常处理解决重复添加同一用户-cnblog
    2.6全局异常处理2.6.1思路分析要想解决上述测试中存在的问题,我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:A.在Controller方法中加入try...catch进行......
  • 过滤器实现登录拦截-cnblog
    1.3代码实现1).定义登录校验过滤器自定义一个过滤器LoginCheckFilter并实现Filter接口,在doFilter方法中完成校验的逻辑。那么接下来,我们就根据上述分析的步骤......
  • 文件上传解决方案-cnblog
    1.文件上传下载1.1上传介绍1.1.1概述文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用......
  • 常见网络模型/线程模型
    1.连接独占线程或进程在这个模型中,线程/进程处理来自绑定连接的消息,在连接断开前不退也不做其他事情。当连接数逐渐增多时,线程/进程占用的资源和上下文切换成本会越来越大......
  • C语言学习 指针: 案例: 交换两个变量的值
    第一版:1#include<stdio.h>2#include<stdlib.h>3#include<string.h>4#include<io_utils.h>56voidSwap(inta,intb){7inttemp=a;8a=b;......
  • 不使用docker部署项目需要启动的一些服务-cnblog
    mysqlredis./redis-servenginx:./nginx源springboot项目:nohupjava-jarhelloworld-1.0-SNAPSHOT.jar&>hello.log&springboot项目部署到服务器的注意......
  • SSM复习-cnblog
    依赖注入,注入配置文件中的属性名1.2加载properties文件上节中我们已经完成两个数据源druid和C3P0的配置,但是其中包含了一些问题,我们来分析下:这两个数据源中都使用到......