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

 更新时间:2023年10月25日 11:00:24   作者:飘杨......  
在一般性的基设需求中,有需要获取当前用户操作记录的情况,也就是说我们需要记录当前用户的信息,如:id、昵称、账号等信息,这篇文章主要介绍了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 {
            <strong>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());
            }</strong>
            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) {
        <strong>Long memberId </strong><strong>=</strong><strong> WebContextHolder.getMemberId();</strong>
        log.info("memberId:{}",memberId);//用户id
        Date date = new Date();
        <strong>this.strictInsertFill(metaObject, "createUser", Long.class, memberId);
        this.strictInsertFill(metaObject, "updateUser", Long.class, memberId);
        </strong>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());
    }
}

到此这篇关于SpringBoot获取当前操作用户的id/信息的文章就介绍到这了,更多相关SpringBoot获取当前用户id内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一篇文章带你了解jdk1.8新特性--为什么使用lambda表达式

    一篇文章带你了解jdk1.8新特性--为什么使用lambda表达式

    Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,本篇文章就带你了解,希望能给你带来帮助
    2021-08-08
  • Spring Boot中使用JSR-303实现请求参数校验

    Spring Boot中使用JSR-303实现请求参数校验

    这篇文章主要介绍了Spring Boot中使用JSR-303实现请求参数校验,JSR-303校验我们一般都是对Java的实体类对象进行校验,主要检验JSR-303是Java中的一个规范,用于实现请求参数校验在我们的实体类对象的属性上,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • java异常处理详细介绍及实例

    java异常处理详细介绍及实例

    这篇文章主要介绍了java异常处理详细介绍及实例的相关资料,本文对java异常进行了知识层次的总结,需要的朋友可以参考下
    2017-04-04
  • springboot使用jasypt加密库实现数据库加解密示例代码

    springboot使用jasypt加密库实现数据库加解密示例代码

    这篇文章主要给大家介绍了关于springboot使用jasypt加密库实现数据库加解密的相关资料,Jasypt是一个用于配置文件加密的Java库,它可以用来加密和解密配置文件中的敏感信息,如数据库密码、API 密钥等,需要的朋友可以参考下
    2024-04-04
  • logback的isDebugEnabled日志配置级别源码解析

    logback的isDebugEnabled日志配置级别源码解析

    这篇文章主要为大家介绍了logback的isDebugEnabled日志配置级别源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Android 屏幕分辨率的整理

    Android 屏幕分辨率的整理

    这篇文章主要介绍了Android 屏幕分辨率的整理的相关资料,这里整理了常见的分辨率希望能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • java selenium教程环境搭建方法

    java selenium教程环境搭建方法

    本文主要介绍java selenium 环境搭建,这里详细介绍了selenium的安装环境搭建,有兴趣的小伙伴可以参考下
    2016-08-08
  • 关于java.lang.NumberFormatException: null的问题及解决

    关于java.lang.NumberFormatException: null的问题及解决

    这篇文章主要介绍了关于java.lang.NumberFormatException: null的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • java生成二维码并且给二维码添加logo

    java生成二维码并且给二维码添加logo

    这篇文章主要介绍了java生成二维码并且给二维码添加logo的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Spring中的@ResponseStatus使用

    Spring中的@ResponseStatus使用

    这篇文章主要介绍了Spring中的@ResponseStatus使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论