springboot登錄攔截器+ThreadLocal實現(xiàn)用戶信息存儲的實例代碼
ThreadLocal
- 是什么
從名字我們就可以看到ThreadLocal 叫做本地線程變量,意思是說,ThreadLocal 中填充的的是當前線程的變量,該變量對其他線程而言是封閉且隔離的,ThreadLocal 為變量在每個線程中創(chuàng)建了一個副本,這樣每個線程都可以訪問自己內(nèi)部的副本變量。
1、在進行對象跨層傳遞的時候,使用ThreadLocal可以避免多次傳遞,打破層次間的約束。
2、線程間數(shù)據(jù)隔離
3、進行事務操作,用于存儲線程事務信息。
4、數(shù)據(jù)庫連接,Session會話管理。
- 內(nèi)部實現(xiàn)
創(chuàng)建了ThreadLocalMap用來保存數(shù)據(jù)
static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } } }
內(nèi)部繼承弱引用,當map為空時會被gc回收
- 四種引用類型
– 強引用:除非為null,內(nèi)存不足也不會進行回收
– 弱引用:內(nèi)存不足時GC會將其回收
– 軟應用:無論是否有用,GC時會將其回收
– 虛引用:近似于沒有引用,用于跟蹤對象被垃圾回收器回收的活動
@Component public class HostHolder { private ThreadLocal<User> users = new ThreadLocal<>(); public User getUser() { return users.get(); } public void setUser(User user) { users.set(user); } public void clear() { users.remove(); } }
用ThreadLocal保存user數(shù)據(jù)
下面實例代碼介紹登錄攔截器+ThreadLocal實現(xiàn)用戶信息存儲
/** * 登錄攔截器 */ public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在請求處理之前進行調(diào)用,返回true則繼續(xù)向下執(zhí)行,返回false則中斷請求 String loginId = request.getHeader("loginId"); if (StringUtils.isNotBlank(loginId)) { // 如果請求頭中包含loginId,將其設置到LoginContextHolder中 LoginContextHolder.set("loginId", loginId); } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在整個請求結束之后被調(diào)用,也就是在DispatcherServlet渲染了對應的視圖之后執(zhí)行,主要是做清理工作 // 移除LoginContextHolder中的loginId LoginContextHolder.remove(); } }
到此這篇關于springboot登錄攔截器+ThreadLocal實現(xiàn)用戶信息存儲的實例代碼的文章就介紹到這了,更多相關springboot登錄攔截器用戶信息存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- springboot在filter中如何用threadlocal存放用戶身份信息
- SpringBoot中的ThreadLocal保存請求用戶信息的實例demo
- SpringBoot ThreadLocal 簡單介紹及使用詳解
- SpringBoot+ThreadLocal+AbstractRoutingDataSource實現(xiàn)動態(tài)切換數(shù)據(jù)源
- Springboot公共字段填充及ThreadLocal模塊改進方案
- SpringBoot ThreadLocal實現(xiàn)公共字段自動填充案例講解
- SpringBoot通過ThreadLocal實現(xiàn)登錄攔截詳解流程
- springboot 使用ThreadLocal的實例代碼
- SpringBoot中使用?ThreadLocal?進行多線程上下文管理及注意事項小結
相關文章
在SpringBoot中使用YourKit進行性能調(diào)優(yōu)的教程詳解
在應用程序的開發(fā)過程中,性能調(diào)優(yōu)是一個重要的環(huán)節(jié),在SpringBoot應用程序中,我們可以使用YourKit來進行性能調(diào)優(yōu),YourKit是一款非常強大的Java性能調(diào)優(yōu)工具,在本文中,我們將介紹如何在 SpringBoot應用程序中使用YourKit進行性能調(diào)優(yōu)2023-06-06Java應用層協(xié)議WebSocket實現(xiàn)消息推送
后端向前端推送消息就需要長連接,首先想到的就是websocket,下面這篇文章主要給大家介紹了關于java后端+前端使用WebSocket實現(xiàn)消息推送的詳細流程,需要的朋友可以參考下2023-02-02Java自帶定時任務ScheduledThreadPoolExecutor實現(xiàn)定時器和延時加載功能
今天小編就為大家分享一篇關于Java自帶定時任務ScheduledThreadPoolExecutor實現(xiàn)定時器和延時加載功能,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12Java如何解析html中的內(nèi)容并存到數(shù)據(jù)庫詳解
最近用到了Java解析Html的一個庫Jsoup,所以下面這篇文章主要給大家介紹了關于Java如何解析html中的內(nèi)容并存到數(shù)據(jù)庫的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-03-03spring Data jpa簡介_動力節(jié)點Java學院整理
這篇文章主要介紹了spring Data jpa簡介的相關資料,需要的朋友可以參考下2017-09-09