2011-06-20 71 views

回答

102

這取決於你如何配置它(或者說,你可以配置一個不同的行爲)。

在Web應用程序中,您將使用與SecurityContextPersistenceFilter交互的ThreadLocalSecurityContextHolderStrategy

該爪哇SecurityContextPersistenceFilter開始於文檔:

填充{@link SecurityContextHolder中}與來自配置的 獲得 信息{@link SecurityContextRepository}之前 請求並將其存儲回 存儲庫一旦請求已完成 並清除上下文 持有者。默認情況下,它使用{@link HttpSessionSecurityContextRepository}。 查看此類信息 HttpSession相關 配置選項。

BTW:HttpSessionSecurityContextRepository是SecurityContextRepository的唯一實現(我已經在默認庫中找到)

它的工作原理是這樣的:

  • HttpSessionSecurityContextRepository使用HttpSession中(關鍵=」 SPRING_SECURITY_CONTEXT「)來存儲一個SecurityContext對象。
  • SecurityContextPersistenceFilter是一個過濾器,它使用SecurityContextRepository例如HttpSessionSecurityContextRepository加載和存儲SecurityContext對象。如果一個HttpRequest通過過濾器,過濾器獲取從存儲庫中SecurityContext,並把它放在SecurityContextHolder裏(SecurityContextHolder#setContext
  • SecurityContextHolder有兩個方法setContextgetContext。兩者都使用SecurityContextHolderStrategy來指定在set-和get-Context方法中完成了什麼。 - 例如,ThreadLocalSecurityContextHolderStrategy使用本地線程來存儲上下文。

所以總結:用戶主體(SecurityContext的元素)存儲在HTTP會話中。並且對於每個請求,它都會放入您訪問它的本地線程中。