2017-08-17 105 views

回答

3

Spring Security有一个可配置的策略来存储SecurityContextSecurityContextHolder。变量只是一种策略。以下是3种策略。

  1. ThreadLocalSecurityContextHolderStrategy
  2. InheritableThreadLocalSecurityContextHolderStrategy
  3. 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

相关问题