为什么Spring Security将SecurityContext存储在线程局部变量中

Xia*_* Li 3 spring spring-security

据我所知,Spring Security使用过滤器,以获得SecurityContextHttpSession,将其存储到一个ThreadLocal变量.处理完请求后,过滤器将SecurityContext后退保存到HttpSession.我的问题是为什么Spring Security不SecurityContext直接使用?为什么要保存ThreadlocalHttpSession再次保存?

sha*_*zin 6

春季安全有一个可配置的策略存储SecurityContextSecurityContextHolder.ThreadLocal变量只是一种策略.以下是3种策略.

  1. ThreadLocalSecurityContextHolderStrategy
  2. InheritableThreadLocalSecurityContextHolderStrategy
  3. GlobalSecurityContextHolderStrategy

在,方面ThreadLocalSecurityContextHolderStrategy,

我的问题是Spring Security只是直接使用SecurityContext吗?

因为Web/Application Server的工作方式在多个供应商(Tomcat,JBOSS)之间并不相同.Spring Security不能100%确定1个线程将仅用于满足一个用户会话.A Thread可能在涉及线程池时主要共享.因此SecurityContext,将ThreadLocal变量存储在变量中并不会使其表现得像HttpSession.

为什么要保存到Threadlocal并再次保存回HttpSession?

如上所述,Same Thread可用于处理来自不同用户的多个请求.因此,在请求结束时,SecurityContext必须从ThreadLocal变量中腾出空间,以便下一个请求可以使用它.完成后的存储HttpSession是为了在SecurityContext来自同一会话的下一个请求进入时创建后退.