2017-07-21 35 views
1

在Jersey文檔中,Example 16.2顯示了將SecurityContext注入Jersey資源單例的示例。爲什麼將一個SecurityContext注入Jersey Singleton線程安全?

Jersey Example 16.2

肯定的文檔是正確的,並給予確實的例子是線程安全的。我懷疑SecurityContext的注入只發生一次,並且當調用getUserPrincipal()時,它可能從連接到線程本身的某個結構(也許是ThreadLocal對象?)中獲取用戶數據。這是我能看到當有大量線程參與競爭時向最終用戶提供正確用戶信息的唯一途徑。

任何人都可以證實這種行爲,或者解釋Jersey例子的線程安全嗎?

回答

3

Dynamic Proxies與ThrealLocal支持一起使用。這是在JAX-RS規範還挺解釋,在關於某些請求範圍注射對象(見this post for spec quote

我懷疑的SecurityContext的注入產生一次

是的,這是真的,但注入的內容實際上是代理。您可以打印出課程名稱,您將看到它實際上是一個代理。本文中的第一個鏈接解釋了它的工作原理。在代理上調用方法時,它將調用委託給線程本地安全上下文。

參見:

相關問題