Java使用ThreadLocal實現當前登錄信息的存取功能
一、使用ThreadLocal實現當前登錄信息的存取
在項目中我們增加一個員工有一些信息是需要我們自己填入的,有一些信息不需要我們自己填寫,例如:創建時間,創建人等,那麼這些事件我們通常就是使用實體類然後set相關屬性,但是我們可以使用MetaObjectHandler來將這些不要要我們自己穿的參數進行默認填充,但是創建人和更新人是獲取的當前用戶登錄人。
我們都知道想要獲取當前的登錄人就需要使用HttpServletRequest來獲取,但是我們字符串填充類沒有這個,那麼我們就可以使用ThreadLocal來實現當前登錄信息的存取。
ThreadLocal的實現原理就是,一個線程裡面有局部變量,我們可以利用局部變量來存取數據,當然我們必須保證是同一個線程這樣才能準確的存儲和獲取數據,在我們一個請求流程下來我們都使用的一個線程,所以這裡我們就可以使用ThreadLocal來進行信息的存取。
1,寫一個工具類用於存取用戶id
/** * @Author: KSQC * @Description: 基於ThreadLocal對登陸用戶信息進行存儲和讀取 * @Date: 2023/2/16 22:11 */ public class BaseContext { private static ThreadLocal<Long> threadLocal = new ThreadLocal<>(); public static void setCurrentId(Long id){ threadLocal.set(id); } public static Long getCurrentId(){ return threadLocal.get(); } }
2、在用戶登錄的時候我們在過濾器中可以獲取用戶的id,這個時候我們將用戶id放入ThreadLocal中。
//4、判斷登錄狀態,如果已登錄,則直接放行 if(request.getSession().getAttribute("employee") != null){ log.info("用戶已登錄,用戶id為:{}",request.getSession().getAttribute("employee")); Long empId = (Long) request.getSession().getAttribute("employee"); BaseContext.setCurrentId(empId); filterChain.doFilter(request,response); return; }
然後在需要用到用戶id的地方進行讀取:
@Override public void insertFill(MetaObject metaObject) { log.info("公共字段自動填充[insert]..."); log.info(metaObject.toString()); metaObject.setValue("createTime", LocalDateTime.now()); metaObject.setValue("updateTime",LocalDateTime.now()); metaObject.setValue("createUser",BaseContext.getCurrentId()); metaObject.setValue("updateUser",BaseContext.getCurrentId()); }
在上面的方法寫完成後,我們直接運行程序,然後新增和修改員工就會進入這些方法然後進行字段填充操作。
二、總結
這裡的相關內容還沒有整理完畢,文章後面持續更新,建議收藏。
文章中涉及到的命令大傢一定要像我一樣每個都敲幾遍,隻有在敲的過程中才能發現自己對命令是否真正的掌握瞭。
到此這篇關於Java使用ThreadLocal實現當前登錄信息的存取功能的文章就介紹到這瞭,更多相關Java ThreadLocal當前登錄信息的存取內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- java構造函數的三種類型總結
- Java8的DateTimeFormatter與SimpleDateFormat的區別詳解
- Java精品項目瑞吉外賣之登陸的完善與退出功能篇
- Java中ThreadLocal 導致內存 OOM 的原因分析
- Spring中使用自定義ThreadLocal存儲導致的坑及解決