2011-06-20 35 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会话中。并且对于每个请求,它都会放入您访问它的本地线程中。