據我所知,Spring Security使用過濾器從HttpSession
獲取SecurityContext
,將其存儲到ThreadLocal
變量。處理請求後,篩選器將SecurityContext
保存回HttpSession
。 我的問題是爲什麼Spring Security不直接使用SecurityContext
? 爲什麼要保存到Threadlocal
並再次保存到HttpSession
?爲什麼Spring Security在線程局部變量中存儲SecurityContext
1
A
回答
3
Spring Security有一個可配置的策略來存儲SecurityContext
在SecurityContextHolder
。變量只是一種策略。以下是3種策略。
- ThreadLocalSecurityContextHolderStrategy
- InheritableThreadLocalSecurityContextHolderStrategy
- GlobalSecurityContextHolderStrategy
在ThreadLocalSecurityContextHolderStrategy
方面,
我的問題是這樣不Spring Security的只是直接使用SecurityContext的?
因爲Web/Application Server在多個供應商(Tomcat,JBOSS)中的工作方式並不相同。 Spring Security不能100%確定1個線程只能用於滿足一個用戶會話。當涉及線程池時,可能主要共享Thread
。因此,將SecurityContext
存儲在ThreadLocal
變量中並不會使其行爲與HttpSession
中的行爲相同。
爲什麼保存到Threadlocal並再次保存到HttpSession?
正如我上面所解釋的,可以使用相同的Thread
來處理來自不同用戶的多個請求。因此,在請求結束時,SecurityContext
必須從ThreadLocal
變量中騰出,以便下一個請求可以使用它。在HttpSession
中的存儲完成以在來自同一會話的下一個請求進入時創建SecurityContext
。
相關問題
- 1. 爲什麼windows使用堆棧來存儲局部變量?
- 2. 爲什麼在存在局部變量時調用全局變量?
- 3. 線程局部變量
- 4. 線程局部變量
- 5. Spring Security如何通過Web應用程序請求管理線程中的SecurityContext?
- 6. FORTRAN在哪裏存儲局部變量?
- 7. 在程序集中存儲局部變量
- 8. .NET局部變量存儲在哪裏?
- 9. 如何在存儲過程中使用局部變量?
- 10. 爲什麼局部變量會殺死我的全局變量?
- 11. 爲什麼要局部變量?
- 12. Python 3如何存儲局部變量?
- 13. 在局部變量存儲過程中輸入等於(=)
- 14. 爲什麼要使用線程本地存儲(TlsAlloc,TlsGetValue,ets)而不是局部變量
- 15. 爲什麼SecurityContext的Authentication對象不能在線程間共享?
- 16. 在線程對象本身中存儲線程特定變量
- 17. 在Spring Security中存儲用戶對象
- 18. 爲什麼存儲一個局部變量並將其讀回觸發TargetInvocationException?
- 19. 在SecurityContext(Spring 2.5.2)
- 20. 當存儲該引用的局部變量設置爲空時,爲什麼靜態變量未設置爲空?
- 21. 多線程,lambdas和局部變量
- 22. VBA Excel:存儲在內存中的局部變量?
- 23. C上的局部變量存儲在內存中
- 24. 爲什麼編譯器將變量存儲在寄存器中?
- 25. Kotlin局部變量線程安全
- 26. 理解爲什麼多線程無法讀取全局變量
- 27. 爲什麼局部變量不能在聲明和全局變量分配?
- 28. LD_PRELOAD和線程局部變量
- 29. 如何在Spring Security測試中通過WithSecurityContextFactory設置SecurityContext?
- 30. 如何在線程上存儲變量?