Spring Security如何在跨Web应用程序请求的线程中管理SecurityContext?

在SpringSecurity中,它有一个类名SecurityContextHolder及其规范:’将给定的SecurityContext与当前执行线程关联。’ 使用Web应用程序每当请求到达服务器时,Spring还重新加载并在SecurityContextHolder中为其线程设置该请求的SecurityContext?

是的, SecurityContextPersistenceFilter会处理这个问题。 默认情况下,它会在HttpSession中找到SecurityContext,并通过SecurityContextHolder将其绑定到线程。 当请求完成处理时,它会反过来 – 它从线程获取SecurityContext并将其放入会话中。

来自Javadoc:

使用在请求之前从配置的SecurityContextRepository获取的信息填充SecurityContextHolder,并在请求完成并清除上下文持有者后将其存储回存储库。 默认情况下,它使用HttpSessionSecurityContextRepository。

使用Web应用程序每当请求到达服务器时,Spring还重新加载并在SecurityContextHolder中为其线程设置该请求的SecurityContext?

基本上是的。

SecurityContextHolder.getInstance()的默认行为是返回它存储为当前线程的线程局部的SecurityContextHolder实例。 (这只是默认机制。您可以通过调用SecurityContextHolder.setStrategemName()来使用不同的策略来定位SecurityContextHolder

SpringSecurityfilter确保请求的SecurityContextHolder (无论它位于何处)在开始时加载请求凭据,并在请求处理结束时清除持有者。