SpringBoot如何獲取當前操作用戶的id/信息
一、概述
在一般性的基設需求中,有需要獲取當前用戶操作記錄的情況,也就是說我們需要記錄當前用戶的信息。如:id、昵稱、賬號等信息。
這些信息一般用于記錄用戶的個人行為,例如:用戶的操作日志,記錄某些數(shù)據(jù)的更改或者添加者信息等。
本例主要用于記錄更改及添加者信息(操作數(shù)據(jù)庫時)
我希望借助mybatis的默認插件:MetaObjectHandler類實現(xiàn)公共字段的插入和更改,如:創(chuàng)建者、更新者、創(chuàng)建時間、更新時間、刪除狀態(tài)等。
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用于存儲登錄用戶信息,如:根據(jù)token獲取用戶信息,然后再把用戶信息存入ThreadLocl
二、代碼示例
1.首先定義一個過濾器,用于獲取請求的token,然后根據(jù)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.創(chuàng)建一個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內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
一篇文章帶你了解jdk1.8新特性--為什么使用lambda表達式
Lambda是一個匿名函數(shù),我們可以把Lambda表達式理解為是一段可以傳遞的代碼,本篇文章就帶你了解,希望能給你帶來幫助2021-08-08Spring Boot中使用JSR-303實現(xiàn)請求參數(shù)校驗
這篇文章主要介紹了Spring Boot中使用JSR-303實現(xiàn)請求參數(shù)校驗,JSR-303校驗我們一般都是對Java的實體類對象進行校驗,主要檢驗JSR-303是Java中的一個規(guī)范,用于實現(xiàn)請求參數(shù)校驗在我們的實體類對象的屬性上,感興趣的朋友跟隨小編一起看看吧2023-10-10springboot使用jasypt加密庫實現(xiàn)數(shù)據(jù)庫加解密示例代碼
這篇文章主要給大家介紹了關于springboot使用jasypt加密庫實現(xiàn)數(shù)據(jù)庫加解密的相關資料,Jasypt是一個用于配置文件加密的Java庫,它可以用來加密和解密配置文件中的敏感信息,如數(shù)據(jù)庫密碼、API?密鑰等,需要的朋友可以參考下2024-04-04logback的isDebugEnabled日志配置級別源碼解析
這篇文章主要為大家介紹了logback的isDebugEnabled日志配置級別源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11關于java.lang.NumberFormatException: null的問題及解決
這篇文章主要介紹了關于java.lang.NumberFormatException: null的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09