3

我有一些關於Spring Security 3.0.5和SecurityContext的問題。首先,生病試圖得出什麼結論,我知道:Spring Security:多個ThreadLocals中的SecurityContext實例相同,這是如何工作的?

  • SecurityContextHolder中存儲的SecurityContext
  • 請求之間,SecurityContext的存儲在HttpSession中
  • 開始請求:SecurityContextHolder中獲取的SecurityContext從HttpSession中
  • 結束請求:SecurityContextHolder將SecurityContext置於HttpSession中

  • 在請求期間,在服務器上,SecurityContextHolder使用ThreadLocal。無處不在的應用程序(相同的請求),SecurityContext的可訪問

現在我的問題....

- >兩個請求:SecurityContext的實例將共享

如何這是否工作?我的意思是,SecurityContextHolder爲每個請求使用一個ThreadLocal。 2請求= 2 ThreadLocals

每個請求都會:HttpSession的getSessionAttribute(SecurityContext) 如果他們在SecurityContext上工作,會發生什麼? SecurityContext是否在所有ThreadLocals中更改?

據我所知:是(??)

這是如何工作的?他們如何在同一個實例上工作?我的意思是,我真的無法想象具有兩個不同ThreadLocals的兩個不同線程可以在同一個實例上工作嗎?

API(ThreadLocal): 該類提供線程局部變量。這些變量不同於它們的正常副本,因爲訪問一個線程的每個線程(通過它的get或set方法)都有其自己的,獨立初始化的變量副本。

我的意思是說:複製!也許我錯了,並且兩個線程不可能在同一個SecurityContext上工作?但是Spring Security Documentation這樣說!

如果有人能夠向我解釋這一點,會很棒:-)謝謝!

回答

2

每個線程都有自己的值ThreadLocal,但沒有任何東西阻止這些值相等。因此,在這種情況下,多個線程將引用同一個SecurityContext實例。

通常這不是問題,但是如果要修改安全上下文,則可以啓用防禦性複製,請參閱SEC-356

+0

但是爲什麼ThreadLocal API會說這些變量只是複製?我的意思是,如果他們是複製品,他們不能成爲「相同」,對吧? – nano7 2011-06-16 18:05:16

+0

@ nano7:Java中的對象由引用標識。因此,引用可以被複制,但它們仍然指向同一個對象。 – axtavt 2011-06-16 18:37:38

+0

啊。所以我誤解了它,因爲......我不是一個專家....但我仍然認爲ThreadLocal API可以更精確。謝謝! – nano7 2011-06-17 10:25:40

相關問題