首页 > 其他分享 >SpringBoot获取当前操作用户的id/信息

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

时间:2023-10-25 10:55:24浏览次数:40  
标签:strictInsertFill metaObject SpringBoot public memberId id 获取 token class

一、概述

  在一般性的基设需求中,有需要获取当前用户操作记录的情况,也就是说我们需要记录当前用户的信息。如: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());
    }
}

 

标签:strictInsertFill,metaObject,SpringBoot,public,memberId,id,获取,token,class
From: https://www.cnblogs.com/tony-yang-flutter/p/17786631.html

相关文章

  • 使用Java 8的Stream API来对集合中的数据根据id去重并且同一个id只取符合条件的那一个
    `ListdataList=newArrayList<>();dataList.add(newData(1,"A"));dataList.add(newData(2,"B"));dataList.add(newData(1,"C"));dataList.add(newData(3,"D"));Map<Integer,Data>filteredMap=d......
  • unity打包 android
    第一种:手动把没有的包都放入C:\ProgramFiles\Unity\Hub\Editor\2022.3.3f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib 第二种:修改镜像urlC:\ProgramFiles\Unity\Hub\Editor\2022.3.3f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools......
  • 分区函数 Partition By 与 row_number() 的用法 & 排序rank()的用法详解(获取分组(分
    partitionby关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partitionby用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,分区函数一般与排名函数一起使用。准备测试数据:createtable......
  • SpringBoot实现对文件的断点续传和秒传
    本文断点续传文件思路:前端(客户端)需要根据固定大小对文件进行分片,请求后端(服务端)时要带上分片序号和大小;服务端创建conf文件用来记录分块位置,conf文件长度为总分片数,每上传一个分块即向conf文件中写入一个127,那么没上传的位置就是默认的0,已上传的就是Byte.MAX_VALUE127(这步是......
  • SpringBoot路径匹配
    Spring5.3之后加入了更多的请求路径匹配的实现策略;以前只支持AntPathMatcher策略,现在提供了PathPatternParser策略。并且可以让我们指定到底使用那种策略。1.Ant风格路径用法Ant风格的路径模式语法具有以下规则:*:表示任意数量的字符。?:表示任意一个字符。**:表示......
  • springboot生成二维码的正确姿势-附视频附源码
    @目录前言初始化SpringBoot项目引入依赖编码编写工具类生成二维码资源共享二维码的原理是什么,如何保证不重复?你有没有想过这样一件事,二维码是实现原理是什么?如何保证各个平台的二维码是唯一的?就算你的程序停止运行,但是你的二维码依然存在。设计上要保证唯一性,比如在物流等环......
  • SolidWorks (SW) 2023 下载及安装教程
    本文所提供的安装教程均来自互联网,仅供大家学习使用,不可用于商业用途,否则本作者不负责,如本文提供的信息涉及侵权,请联系作者删除,谢谢大家配合。  软件介绍:Solidworks是一款功能强大的三维机械设计软件系统,有功能强大、易学易用和技术创新三大特点,这使得SolidWorks成为领先的、主......
  • 基于Aidlux的图片相似度对比
    印章检测流程:利用深度神经网络,提取印章深度特征,同时学习印章之间的相似度,自己与自己相似,自己与其它不相似。1. Siamese网络Siamese网络是一种常用的深度学习相似性度量方法,它包含两个共享权重的CNN网络(说白了这两个网络其实就是一个网络,在代码中就构建一个网络就行了),将两个输入......
  • 中文Windows修改为英文并解决“无法获取此Windows显示语言”问题的方法
      本文介绍在Windows10操作系统中,修改系统的显示语言的方法;并解决在这一过程中,出现的“很抱歉,我们无法获取此Windows显示语言”报错问题。  本文就以将原本系统语言的中文修改为英文为例,介绍具体的方法。首先,我们在电脑左下角的开始菜单处,右键并选择“设置”;如下图所示。 ......
  • flask 学习之解决flask migrate时报Can't locate revision identified
    错误原因:数据库已经和flask建立的连接,但是项目中migrations/versions下没有迁移版本文件,但是数据库中alembic_version中有版本号,当数据迁移时没有找到对应的迁移脚本文件,解决方案:手动创建迁移脚本:flaskdbrevision-m  然后将数据库中的alembic_version中的version_num改成......