为什么将一个SecurityContext注入Jersey Singleton线程安全?

bro*_*eib 4 jersey thread-safety

在Jersey文档中,示例16.2显示了将SecurityContext注入Jersey资源单例的示例.

泽西岛示例16.2

当然,文档是正确的,给出的例子确实是线程安全的.

我怀疑SecurityContext的注入只发生一次,并且在getUserPrincipal()调用时,它可能会从附加到线程本身的某个结构(可能是ThreadLocal对象?)中获取用户数据.这是我可以看到当有大量线程竞争时向最终用户提供正确的用户信息的唯一方式.

任何人都可以确认此行为,或以其他方式解释Jersey示例的线程安全性吗?

Pau*_*tha 6

动态代理与ThrealLocal支持一起使用.关于一些请求范围的可注射对象,这在JAX-RS规范中有所解释(请参阅此文章以获取规范报价)

我怀疑SecurityContext的注入只发生一次

是的,这是真的,但注入的实际上是代理.您可以打印出类名,您将看到它实际上是一个代理.这篇文章的第一个链接解释了它是如何工作的.在代理上调用方法时,它会将调用委托给线程本地安全上下文.

也可以看看: