springboot登錄攔截器+ThreadLocal實(shí)現(xiàn)用戶信息存儲(chǔ)的實(shí)例代碼
ThreadLocal
- 是什么
從名字我們就可以看到ThreadLocal 叫做本地線程變量,意思是說,ThreadLocal 中填充的的是當(dāng)前線程的變量,該變量對(duì)其他線程而言是封閉且隔離的,ThreadLocal 為變量在每個(gè)線程中創(chuàng)建了一個(gè)副本,這樣每個(gè)線程都可以訪問自己內(nèi)部的副本變量。
1、在進(jìn)行對(duì)象跨層傳遞的時(shí)候,使用ThreadLocal可以避免多次傳遞,打破層次間的約束。
2、線程間數(shù)據(jù)隔離
3、進(jìn)行事務(wù)操作,用于存儲(chǔ)線程事務(wù)信息。
4、數(shù)據(jù)庫連接,Session會(huì)話管理。
- 內(nèi)部實(shí)現(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)部繼承弱引用,當(dāng)map為空時(shí)會(huì)被gc回收
- 四種引用類型
– 強(qiáng)引用:除非為null,內(nèi)存不足也不會(huì)進(jìn)行回收
– 弱引用:內(nèi)存不足時(shí)GC會(huì)將其回收
– 軟應(yīng)用:無論是否有用,GC時(shí)會(huì)將其回收
– 虛引用:近似于沒有引用,用于跟蹤對(duì)象被垃圾回收器回收的活動(dòng)
@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ù)
下面實(shí)例代碼介紹登錄攔截器+ThreadLocal實(shí)現(xiàn)用戶信息存儲(chǔ)
/**
* 登錄攔截器
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在請(qǐng)求處理之前進(jìn)行調(diào)用,返回true則繼續(xù)向下執(zhí)行,返回false則中斷請(qǐng)求
String loginId = request.getHeader("loginId");
if (StringUtils.isNotBlank(loginId)) {
// 如果請(qǐng)求頭中包含loginId,將其設(shè)置到LoginContextHolder中
LoginContextHolder.set("loginId", loginId);
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整個(gè)請(qǐng)求結(jié)束之后被調(diào)用,也就是在DispatcherServlet渲染了對(duì)應(yīng)的視圖之后執(zhí)行,主要是做清理工作
// 移除LoginContextHolder中的loginId
LoginContextHolder.remove();
}
}到此這篇關(guān)于springboot登錄攔截器+ThreadLocal實(shí)現(xiàn)用戶信息存儲(chǔ)的實(shí)例代碼的文章就介紹到這了,更多相關(guān)springboot登錄攔截器用戶信息存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot在filter中如何用threadlocal存放用戶身份信息
- SpringBoot中的ThreadLocal保存請(qǐng)求用戶信息的實(shí)例demo
- SpringBoot ThreadLocal 簡單介紹及使用詳解
- SpringBoot+ThreadLocal+AbstractRoutingDataSource實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源
- Springboot公共字段填充及ThreadLocal模塊改進(jìn)方案
- SpringBoot ThreadLocal實(shí)現(xiàn)公共字段自動(dòng)填充案例講解
- SpringBoot通過ThreadLocal實(shí)現(xiàn)登錄攔截詳解流程
- springboot 使用ThreadLocal的實(shí)例代碼
- SpringBoot中使用?ThreadLocal?進(jìn)行多線程上下文管理及注意事項(xiàng)小結(jié)
相關(guān)文章
Spring?Boot集成LiteFlow規(guī)則引擎的詳細(xì)過程
本文詳細(xì)介紹了如何在Spring?Boot應(yīng)用程序中集成LiteFlow規(guī)則引擎,并探討如何使用LiteFlow庫來實(shí)現(xiàn)業(yè)務(wù)流程的規(guī)則處理,將通過具體的示例來展示如何在Spring?Boot應(yīng)用程序中配置和使用LiteFlow規(guī)則引擎,以提高系統(tǒng)的靈活性和可維護(hù)性,感興趣的朋友跟隨小編一起看看吧2024-07-07
Spring?boot集成easy?excel實(shí)現(xiàn)導(dǎo)入導(dǎo)出功能
這篇文章主要介紹了Spring?boot集成easy?excel實(shí)現(xiàn)導(dǎo)入導(dǎo)出操作,使用easyexcel,首先要引入easyexcel的maven依賴,具體的版本根據(jù)你的需求去設(shè)置,本文結(jié)合實(shí)例代碼講解的非常詳細(xì),需要的朋友可以參考下2024-05-05
SpringBoot整合高德地圖實(shí)現(xiàn)天氣預(yù)報(bào)功能
在當(dāng)今數(shù)字化時(shí)代,天氣預(yù)報(bào)功能在眾多應(yīng)用中扮演著重要角色,通過整合高德地圖提供的天氣API,我們可以輕松地在自己的SpringBoot項(xiàng)目中實(shí)現(xiàn)這一功能,本文將詳細(xì)介紹如何在SpringBoot項(xiàng)目中整合高德地圖的天氣預(yù)報(bào)功能,感興趣的小伙伴跟著小編一起來看看吧2025-03-03
詳解spring boot容器加載完后執(zhí)行特定操作
這篇文章主要介紹了詳解spring boot容器加載完后執(zhí)行特定操作,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
mybatis Invalid bound statement(not foun
這篇文章主要介紹了mybatis Invalid bound statement(not found)排坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

