ThreadLocal常用方法:
public void set(T value) 设置当前线程的线程局部变量的值
public T get() 获取当前线程所对应的线程局部变量的值

我们可以先在doFilter中,保存当前用户的id,后面需要用的地方,去获取这个id,
每一次http请求都会是一个独立的线程,而且java处理1次请求的相关操作都会在同一个线程上处理。所以前面设置局部变量,后面的操作可以使用。

第一步,创建一个工具类BaseContext

  1. package com.tj.utils;
  2. import com.tj.system.domain.Users;
  3. /**
  4. * 基于ThreadLocal封装工具类,用户保存和获取当前用户信息
  5. */
  6. public class BaseContext {
  7. private static ThreadLocal<Users> threadLocal = new ThreadLocal<>();
  8. //设置当前的用户id
  9. public static void setUser(Users user) { threadLocal.set(user); }
  10. //获取当前的用户id
  11. public static Users getUser() {
  12. return threadLocal.get();
  13. }
  14. }

第二步,在doFilter地方缓存用户id

参考
doFilter是否登录状态验证和拦截

  1. //当前请求的用户id
  2. Long userId = Long.valueOf(decodedJWT.getClaim("id").asString());
  3. //中文对应有个解码
  4. String userName = URLDecoder.decode(decodedJWT.getClaim("userName").asString(), "UTF-8");
  5. //当前线程上设置用户id,用户姓名,BaseContext是自己编写的类,注意一下
  6. Users user = new Users();
  7. user.setId(userId);
  8. user.setUser_name(userName);
  9. BaseContext.setUser(user);
  10. log.info("token验证通过,threadLocal线程缓存用户信息为:{}", user);

第三步,在自定义的对象数据处理器MyMetaObjecthandler中获取用户id

参考:
@TableField公共字段自动填充,如登记人,登记时间