随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

SpringBoot获取当前操作用户的id/信息

一、概述

  在一般性的基设需求中,有需要获取当前用户操作记录的情况,也就是说我们需要记录当前用户的信息。如:id、昵称、账号等信息。

  这些信息一般用于记录用户的个人行为,例如:用户的操作日志,记录某些数据的更改或者添加者信息等。

  本例主要用于记录更改及添加者信息(操作数据库时)

  我希望借助mybatis的默认插件:MetaObjectHandler类实现公共字段的插入和更改,如:创建者、更新者、创建时间、更新时间、删除状态等。

     this.strictInsertFill(metaObject, "createUser", Long.class, memberId);
        this.strictInsertFill(metaObject, "updateUser", Long.class, memberId);
        this.strictInsertFill(metaObject, "updateTime", Date.class, date);
        this.strictInsertFill(metaObject, "createTime", Date.class, date);
        this.strictInsertFill(metaObject, "deleted", Integer.class, 0);

 

  技术:SpringBoot+ThreadLocal+Redis。其中ThreadLocal用于存储当前线程的用户信息,redis用于存储登录用户信息,如:根据token获取用户信息,然后再把用户信息存入ThreadLocl

二、代码示例

  1.首先定义一个过滤器,用于获取请求的token,然后根据token获取响应的用户信息,获取到用户信息后把用户信息存储的WebContextHolder中(ps:此类是一个封装了ThreadLocal的类)

复制代码
@Slf4j
@Component
@Order(Ordered.HIGHEST_PRECEDENCE + 1)
public class WebContextHolderFilter extends GenericFilterBean {
    @Autowired
    RedisUtil<AdminUserResponse> redisUtil;

    @Override
    @SneakyThrows
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        try {
            String token = request.getHeader("Authorization");
            log.info("token:{}",token);
            if (token != null&&!"undefined".equals(token)) {
                AdminUserResponse adminUserResponse = redisUtil.getValue(token);
                WebContextHolder.setMemberId(adminUserResponse.getUserId());
                log.error("用户id:{}", adminUserResponse.getUserId());
            }
            filterChain.doFilter(request, response);

        } finally {
            WebContextHolder.clear();
        }
    }
}
复制代码

  2.创建一个ThreadLocal用于存储用户id

复制代码
public class WebContextHolder {private static final ThreadLocal<Long> THREAD_LOCAL_MEMBER = new ThreadLocal<>();
public static void setMemberId(Long memberId) {
        THREAD_LOCAL_MEMBER.set(memberId);
    }

    public static Long getMemberId() {
        return THREAD_LOCAL_MEMBER.get();
    }
public static void clear() {
        THREAD_LOCAL_MEMBER.remove();
    }
}
复制代码

  3.在MetaObjectHandler类中使用memberId

复制代码
@Slf4j
@Component
public class MyBatisMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        Long memberId = WebContextHolder.getMemberId();
        log.info("memberId:{}",memberId);//用户id
        Date date = new Date();
        this.strictInsertFill(metaObject, "createUser", Long.class, memberId);
        this.strictInsertFill(metaObject, "updateUser", Long.class, memberId);
        this.strictInsertFill(metaObject, "updateTime", Date.class, date);
        this.strictInsertFill(metaObject, "createTime", Date.class, date);
        this.strictInsertFill(metaObject, "deleted", Integer.class, 0);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "updateUser", Long.class, WebContextHolder.getMemberId());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }
}
复制代码

 

posted on   飘杨......  阅读(1455)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2021-10-25 16进制颜色透明度对照表
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示