多线程 – Spring Security:多个ThreadLocals中的SecurityContext实例相同,它是如何工作的?

我有一些关于
Spring Security 3.0.5和SecurityContext的问题.首先,我试着总结一下我所知道的:

> SecurityContextHolder存储SecurityContext
>在Request之间,SecurityContext存储在HttpSession中
>请求开始:SecurityContextHolder从HttpSession获取SecurityContext
>请求结束:SecurityContextHolder将SecurityContext放入HttpSession
>在请求期间,在服务器上,SecurityContextHolder使用ThreadLocal.在应用程序的任何地方(相同的请求),都可以访问SecurityContext

现在我的问题….

– >两个请求:将共享SecurityContext实例

这是如何运作的?我的意思是,SecurityContextHolder为每个请求使用ThreadLocal.
2 Request = 2 ThreadLocals

每个请求都执行:来自HttpSession的getSessionAttribute(SecurityContext)
如果他们使用SecurityContext会发生什么? SecurityContext是否在所有ThreadLocals中都发生了变化?

据我所知:是(??)

这是如何运作的?他们如何在同一个实例上工作?我的意思是,我真的无法想象具有两个不同ThreadLocals的两个不同线程如何在同一个实例上工作?

API (ThreadLocal):
This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable.

我的意思是,就是这样:复制!也许我错了,两个线程不可能在同一个SecurityContext上工作?但是Spring Security Documentation就这么说了!

如果有人能向我解释一下会很好:-)谢谢!

最佳答案 每个线程都有自己的ThreadLocal值,但没有什么能阻止这些值相等.因此,在这种情况下,多个线程将引用相同的SecurityContext实例.

通常这不是问题,但如果要修改安全上下文,可以启用防御性复制,请参阅SEC-356.

点赞