首頁 > 軟體

Java使用ThreadLocal實現當前登入資訊的存取功能

2023-02-24 06:00:41

一、使用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當前登入資訊的存取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com