最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringSecurity之SecurityContextHolder使用解讀

 更新時間:2023年03月17日 14:08:18   作者:chihaihai  
這篇文章主要介紹了SpringSecurity之SecurityContextHolder使用解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

之前在使用SpringSecurity的過程中并沒有把很多東西理解透徹,找了很多學(xué)習(xí)資料也都只是是很淺顯了告訴你怎么使用這個東西。現(xiàn)在只能自己回過頭來研究研究。。。。終究是一個人扛下了所有/(ㄒoㄒ)/~~。

GO,現(xiàn)在越看spring源碼越覺得里面注釋是真的詳細(xì),雖然英語很菜耐不住有翻譯哈哈哈。

介紹

看了幾篇大佬的技術(shù)博客里面都介紹到,SecurityContextHolder是保存全上下文對象(SecurityContext)的地方。對于這種說法我感覺是完全不正確的,如果后面有新的認(rèn)知我會回來進(jìn)行修改。

我認(rèn)為SecurityContextHolder只是為SecurityContext提供一種存儲策略,只是主導(dǎo)了他的存儲方式及地址。

使用中我們表面上看起來SecurityContext的存儲都是通過SecurityContextHolder在控制人們就習(xí)以為常的說成了Security Context存儲在了SecurityContextHolder中,至于真相我們看源碼慢慢分析。

public class SecurityContextHolder {
	// ~ Static fields/initializers
	// =====================================================================================

	public static final String MODE_THREADLOCAL = "MODE_THREADLOCAL";
	public static final String MODE_INHERITABLETHREADLOCAL = "MODE_INHERITABLETHREADLOCAL";
	public static final String MODE_GLOBAL = "MODE_GLOBAL";
	public static final String SYSTEM_PROPERTY = "spring.security.strategy";
	private static String strategyName = System.getProperty(SYSTEM_PROPERTY);
	private static SecurityContextHolderStrategy strategy;
	private static int initializeCount = 0;

首先從源碼可以看到SecurityContextHolder提供了一個SecurityContextHolderStrategy存儲策略進(jìn)行上下文的存儲,進(jìn)入到Security ContextHolderStrategy接口,由下圖我們可以清晰的看到其總共有三個實(shí)現(xiàn)類。

分別對應(yīng)三種存儲策略,這里我不知道為什么99的文章都只說了threadlocal和global兩種。

要不是看了下實(shí)現(xiàn)類我都信了。

在這里插入圖片描述

就跟字面意思一樣三種策略分別對應(yīng)threadlocal,global,InheritableThreadLocal三種方式。

繼續(xù)回到源碼我們詳細(xì)看這三種方式。

	private static void initialize() {
		if (!StringUtils.hasText(strategyName)) {
			// 如果沒有設(shè)置自定義的策略,就采用MODE_THREADLOCAL模式
			strategyName = MODE_THREADLOCAL;
		}
			// ThreadLocal策略
		if (strategyName.equals(MODE_THREADLOCAL)) {
			strategy = new ThreadLocalSecurityContextHolderStrategy();
		}
		// 采用InheritableThreadLocal,它是ThreadLocal的一個子類
		else if (strategyName.equals(MODE_INHERITABLETHREADLOCAL)) {
			strategy = new InheritableThreadLocalSecurityContextHolderStrategy();
		}
		// 全局策略,實(shí)現(xiàn)方式就是static SecurityContext contextHolder
		else if (strategyName.equals(MODE_GLOBAL)) {
			strategy = new GlobalSecurityContextHolderStrategy();
		}
		else {
			// Try to load a custom strategy  自定義的策略,通過返回創(chuàng)建出
			try {
				Class<?> clazz = Class.forName(strategyName);
				Constructor<?> customStrategy = clazz.getConstructor();
				strategy = (SecurityContextHolderStrategy) customStrategy.newInstance();
			}
			catch (Exception ex) {
				ReflectionUtils.handleReflectionException(ex);
			}
		}

		initializeCount++;
	}

由源碼我們可以得出SecurityContextHolder 默認(rèn)使用的是THREADLOCAL模式,光從名字看感覺就是存儲在threadlocal中的策略到底是不是我們?nèi)ピ创a中分別一探究竟:

ThreadLocalSecurityContextHolderStrategy

final class ThreadLocalSecurityContextHolderStrategy implements
		SecurityContextHolderStrategy {
	// ~ Static fields/initializers
	// =====================================================================================

	private static final ThreadLocal<SecurityContext> contextHolder = new ThreadLocal<>();
	。。。。。。
}

InheritableThreadLocalSecurityContextHolderStrategy

final class InheritableThreadLocalSecurityContextHolderStrategy implements
		SecurityContextHolderStrategy {
	// ~ Static fields/initializers
	// =====================================================================================

	private static final ThreadLocal<SecurityContext> contextHolder = new InheritableThreadLocal<>();
	。。。。。。
}

GlobalSecurityContextHolderStrategy

final class GlobalSecurityContextHolderStrategy implements SecurityContextHolderStrategy {
	// ~ Static fields/initializers
	// =====================================================================================

	private static SecurityContext contextHolder;
	。。。。。。
}

到這里那些說SecurityContext存儲在SecurityContextHolder的大佬們我認(rèn)為應(yīng)該是不嚴(yán)謹(jǐn)?shù)摹?/p>

默認(rèn)是將SecurityContext存儲在threadlocal中,可能是spring考慮到目前大多數(shù)為BS應(yīng)用,一個應(yīng)用同時可能有多個使用者,每個使用者又對應(yīng)不同的安全上下,Security Context Holder為了保存這些安全上下文。

缺省情況下,使用了ThreadLocal機(jī)制來保存每個使用者的安全上下文。

因?yàn)槿笔∏闆r下根據(jù)Servlet規(guī)范,一個Servlet request的處理不管經(jīng)歷了多少個Filter,自始至終都由同一個線程來完成。這樣就很好的保證了其安全性。

但是當(dāng)我們開發(fā)的是一個CS本地應(yīng)用的時候,這種模式就不太適用了。

spring早早的就考慮到了這種情況,這個時候我們就可以設(shè)置為Global模式僅使用一個變量來存儲SecurityContext。比如還有其他的一些應(yīng)用會有自己的線程創(chuàng)建,并且希望這些新建線程也能使用創(chuàng)建者的安全上下文。

這種效果,我們就可以通過將SecurityContextHolder配置成MODE_INHERITABLETHREADLOCAL策略達(dá)到。

SecurityContext又到底是個什么東西呢?稍后新開一遍學(xué)習(xí)記錄。

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot配置及使用Schedule過程解析

    SpringBoot配置及使用Schedule過程解析

    這篇文章主要介紹了SpringBoot配置及使用Schedule過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java 實(shí)戰(zhàn)練手項(xiàng)目之酒店管理系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)練手項(xiàng)目之酒店管理系統(tǒng)的實(shí)現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個酒店管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • IDEA中JetBrains Mono字體的正確安裝姿勢

    IDEA中JetBrains Mono字體的正確安裝姿勢

    在 JetBrains Mono 的設(shè)計(jì)階段,它就充分考慮到了長時間工作可能導(dǎo)致的眼睛疲勞問題,比如字母的大小和形狀、空間量、自然等寬平衡、不必要的細(xì)節(jié)、連字、以及難以區(qū)分的符號等,從而最終設(shè)計(jì)出了這么一款字體
    2021-06-06
  • JAVA面試題 start()和run()詳解

    JAVA面試題 start()和run()詳解

    這篇文章主要介紹了JAVA面試題 啟動線程是start()還是run()?為什么?,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Java基礎(chǔ)之文件概述

    Java基礎(chǔ)之文件概述

    這篇文章主要介紹了Java基礎(chǔ)之文件概述,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05
  • IDEA代碼規(guī)范&質(zhì)量檢查的實(shí)現(xiàn)

    IDEA代碼規(guī)范&質(zhì)量檢查的實(shí)現(xiàn)

    這篇文章主要介紹了IDEA代碼規(guī)范&質(zhì)量檢查的實(shí)現(xiàn),文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java concurrency集合之CopyOnWriteArraySet_動力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency集合之CopyOnWriteArraySet_動力節(jié)點(diǎn)Java學(xué)院整理

    CopyOnWriteArraySet基于CopyOnWriteArrayList實(shí)現(xiàn),其唯一的不同是在add時調(diào)用的是CopyOnWriteArrayList的addIfAbsent(若沒有則增加)方法
    2017-06-06
  • Spring Validator從零掌握對象校驗(yàn)的詳細(xì)過程

    Spring Validator從零掌握對象校驗(yàn)的詳細(xì)過程

    SpringValidator學(xué)習(xí)指南從零掌握對象校驗(yàn),涵蓋Validator接口、嵌套對象處理、錯誤代碼解析等核心概念,幫助開發(fā)者實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的規(guī)范與高效,本文詳細(xì)介紹Spring Validator從零掌握對象校驗(yàn),感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot使用@Async注解可能會遇到的8大坑點(diǎn)匯總

    SpringBoot使用@Async注解可能會遇到的8大坑點(diǎn)匯總

    SpringBoot中,@Async注解可以實(shí)現(xiàn)異步線程調(diào)用,用法簡單,體驗(yàn)舒適,但是你一定碰到過異步調(diào)用不生效的情況,今天,我就列出90%的人都可能會遇到的8大坑點(diǎn),需要的朋友可以參考下
    2023-09-09
  • MybatisPlus整合Flowable出現(xiàn)的坑及解決

    MybatisPlus整合Flowable出現(xiàn)的坑及解決

    這篇文章主要介紹了MybatisPlus整合Flowable出現(xiàn)的坑及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

丹东市| 新宾| 义马市| 南投市| 台州市| 灵川县| 木里| 永平县| 理塘县| 阿城市| 和静县| 黔南| 潮安县| 兰溪市| 荃湾区| 济南市| 肃南| 北京市| 漳平市| 中西区| 永清县| 龙井市| 崇左市| 武山县| 连云港市| 盐亭县| 炉霍县| 济宁市| 铜川市| 吉安县| 揭东县| 讷河市| 旬阳县| 马边| 九寨沟县| 保康县| 佳木斯市| 宜春市| 常熟市| 防城港市| 确山县|