2017-08-17 31 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

相關問題