在Jersey文档中,Example 16.2显示了将一个SecurityContext注入Jersey资源单例的示例。
当然,文档是正确的,给出的例子确实是线程安全的。
我怀疑SecurityContext的注入只发生一次,并且当调用getUserPrincipal()
时,它可能会从附加到线程本身的某个结构(可能是ThreadLocal对象?)中获取用户数据。这是我可以看到当有大量线程竞争时向最终用户提供正确的用户信息的唯一方式。
任何人都可以确认此行为,或以其他方式解释Jersey示例的线程安全性吗?
答案 0 :(得分:6)
Dynamic Proxies与ThrealLocal支持一起使用。对于一些请求范围的可注入对象,在JAX-RS规范中对此进行了解释(参见this post for spec quote)
我怀疑SecurityContext的注入只发生一次
是的,这是真的,但注入的实际上是代理。您可以打印出类名,您将看到它实际上是一个代理。这篇文章的第一个链接解释了它是如何工作的。在代理上调用方法时,它会将调用委托给线程本地安全上下文。
另见: