据我所知,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. 线程局部变量
- 2. FORTRAN在哪里存储局部变量?
- 3. Spring Security如何通过Web应用程序请求管理线程中的SecurityContext?
- 4. .NET局部变量存储在哪里?
- 5. 如何在存储过程中使用局部变量?
- 6. 为什么局部变量会杀死我的全局变量?
- 7. 为什么要局部变量?
- 8. Python 3如何存储局部变量?
- 9. 在局部变量存储过程中输入等于(=)
- 10. 为什么要使用线程本地存储(TlsAlloc,TlsGetValue,ets)而不是局部变量
- 11. 为什么SecurityContext的Authentication对象不能在线程间共享?
- 12. 在Spring Security中存储用户对象
- 13. 为什么存储一个局部变量并将其读回触发TargetInvocationException?
- 14. Kotlin局部变量线程安全
- 15. 在C++中转储局部变量
- 16. 如何在Spring Security测试中通过WithSecurityContextFactory设置SecurityContext?
- 17. C++多线程安全局部变量?
- 18. 装配 - 线程安全局部变量
- 19. 将局部变量中的动态int值存储为静态?
- 20. 为什么局部变量变量不受尊重?
- 21. 为什么我的javascript ajax响应存储在全局变量中?
- 22. 为什么变量在case语句中不是局部的?
- 23. 为什么'删除'不能在javascript中使用局部变量?
- 24. 为什么HTML存储在不显示为HTML的变量中?
- 25. 线程拷贝的局部变量
- 26. 保持并行线程局部变量
- 27. 初始化线程局部变量
- 28. C#局部变量和多线程
- 29. 如何在jQuery点击函数中存储局部变量?
- 30. 为什么C中全局变量的存储类被隐式定义为“extern”?