multithreading - Spring Security : same SecurityContext-instance in multiple ThreadLocals, 是如何工作的?

标签 multithreading httpwebrequest spring-security httpsession thread-local

我有一些关于 Spring Security 3.0.5 和 SecurityContext 的问题。首先,我将尝试总结我所知道的:

  • SecurityContextHolder 存储 SecurityContext
  • Request 之间,SecurityContext 存储在 HttpSession
  • 请求开始:SecurityContextHolder 从 HttpSession 获取 SecurityContext
  • 请求结束:SecurityContextHolder 将 SecurityContext 放入 HttpSession
  • 在请求期间,在服务器上,SecurityContextHolder 使用 ThreadLocal。在应用程序的任何地方(相同的请求),都可以访问 SecurityContext

  • 现在我的问题....

    --> 两个请求:SecurityContext-instance 将被共享

    这是如何运作的?我的意思是,SecurityContextHolder 为每个请求使用 ThreadLocal。
    2 请求 = 2 ThreadLocals

    每个请求都执行:getSessionAttribute (SecurityContext) from HttpSession
    如果它们在 SecurityContext 上工作会发生什么?所有 ThreadLocals 中的 SecurityContext 是否已更改?

    据我所知:是的(??)

    这是如何运作的?它们如何在同一个实例上工作?我的意思是,我真的无法想象具有两个不同 ThreadLocals 的两个不同线程如何在同一个实例上工作?

    API (ThreadLocal): This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable.



    我的意思是,就是这样:复制!也许我错了,两个线程不可能在同一个 SecurityContext 上工作?但是 Spring Security 文档是这么说的!

    如果有人能向我解释,那就太好了:-) 谢谢!

    最佳答案

    每个线程都有自己的值 ThreadLocal ,但没有什么能阻止这些值相等。因此,在这种情况下,多个线程将引用 SecurityContext 的同一实例。 .

    通常这不是问题,但如果你想修改安全上下文,你可以启用防御性复制,见SEC-356 .

    关于multithreading - Spring Security : same SecurityContext-instance in multiple ThreadLocals, 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6376320/

    相关文章:

    java - Spring session 作用域 bean,线程安全

    android - 这个线程安全吗?

    java - 如何在多线程环境下实现FIFO队列

    c# - HttpWebrequest 失败,yande.re(以及 IE 和 curl)["The request was aborted: Could not create SSL/TLS secure channel."]

    https - Httpwebrequest 和 Fiddler

    java - Spring Security 阻止公共(public)休息服务

    java - 覆盖现有的 Spring Security 身份验证

    c++ - .load(std::memory_order_relaxed) 的成本是否与读取非原子变量相同?

    c# - 请求被中止 : Could not create SSL/TLS secure channel

    spring - Spring 中的 "SessionManagementFilter - Requested session ID XXX is invalid"是什么?