目录
一、使用ThreadLocal实现当前登录信息的存取
在项目中我们增加一个员工有一些信息是需要我们自己填入的,有一些信息不需要我们自己填写,例如:创建时间,创建人等,那么这些事件我们通常就是使用实体类然后set相关属性,但是我们可以使用MetaObjectHandler来将这些不要要我们自己穿的参数进行默认填充,但是创建人和更新人是获取的当前用户登录人。
我们都知道想要获取当前的登录人就需要使用HttpServletRequest来获取,但是我们字符串填充类没有这个,那么我们就可以使用ThreadLocal来实现当前登录信息的存取。
ThreadLocal的实现原理就是,一个线程里面有局部变量,我们可以利用局部变量来存取数据,当然我们必须保证是同一个线程这样才能准确的存储和获取数据,在我们一个请求流程下来我们都使用的一个线程,所以这里我们就可以使用ThreadLocal来进行信息的存取。
1,写一个工具类用于存取用户id
/** * @Author: KSQC * @Description: 基于ThreadLocal对登陆用户信息进行存储和读取 * @Date: 2023/2/16 22:11 */ public class BaseContext { private static ThreadLocal<Long> threadLocal = new ThreadLocal<>(); public static void setCurrentId(Long id){ threadLocal.set(id); } public static Long getCurrentId(){ return threadLocal.get(); } }
2、在用户登录的时候我们在过滤器中可以获取用户的id,这个时候我们将用户id放入ThreadLocal中。
//4、判断登录状态,如果已登录,则直接放行 if(request.getSession().getAttribute(\"employee\") != null){ log.info(\"用户已登录,用户id为:{}\",request.getSession().getAttribute(\"employee\")); Long empId = (Long) request.getSession().getAttribute(\"employee\"); BaseContext.setCurrentId(empId); filterChain.doFilter(request,response); return; }
然后在需要用到用户id的地方进行读取:
@Override public void insertFill(MetaObject metaObject) { log.info(\"公共字段自动填充[insert]...\"); log.info(metaObject.toString()); metaObject.setValue(\"createTime\", LocalDateTime.now()); metaObject.setValue(\"updateTime\",LocalDateTime.now()); metaObject.setValue(\"createUser\",BaseContext.getCurrentId()); metaObject.setValue(\"updateUser\",BaseContext.getCurrentId()); }
在上面的方法写完成后,我们直接运行程序,然后新增和修改员工就会进入这些方法然后进行字段填充操作。
二、总结
这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。