2016-12-05 111 views
0

在運行應用程序的多個負載平衡實例時,是否可以防止會話的併發修改?春季會話 - 防止會話的併發修改

上下文:多個tomcat,全部運行相同的應用程序。該應用程序使用spring會話將會話存儲在redis集羣中。負載均衡器將傳入的請求分發給其中一個tomcats(非粘性)。用戶點擊按鈕,tomcat 1非常緩慢地處理請求(性能問題或其他)。用戶再次點擊按鈕,tomcat 2更快並回覆成功。用戶轉到下一頁。 Tomcat 1完成第一個請求並覆蓋會話 - 所有正在進行的頁面的數據都將丟失。

解決方案是鎖定會話。從而tomcat 2可以檢測到併發修改並回復一個錯誤(比獲得不一致的狀態好得多)。

THX很多 AB

回答

0

春季會議中不使用任何會話鎖定機制,因爲這將有性能非常不利的影響。請注意,您的示例關注於單個對話,而鎖會影響屬於給定會話的所有請求,其中許多對於併發執行都非常安全。

對於您的示例中的場景,應採用另一種機制來提供保護。這可能是一些簡單的像禁用按鈕UI,直到動作完成,因此防止後續請求,或使用CSRF保護,這將確保每一個修改服務器端的請求。

另請注意,Spring會話提供的大部分會話存儲庫實現都提供了優化寫操作,其目標是減少競爭條件 - 這包括在保存之前檢查會話以進行修改,以及在某些情況下優化的保存操作只寫入已更改的屬性。這是由於不同性質的底層數據存儲處理每個會話存儲庫不同的,因此您在您所選擇的存儲庫中的SessionRepository#save實施。

也許有點相關,Spring會話從版本1.3.0(即撰寫本文的時候,在發佈候選階段)開始提供了與Spring Security併發會話控制的集成。詳情請查看reference manual

+0

Thx很多Vedran。一些言論: 禁用按鈕將不會解決問題,因爲用戶仍然可以點擊「F5」,或者使用多個瀏覽器窗口。 我沒有找到一個合適的機制來處理任何SessionRepository我的問題 - 反正RedisOperationsSessionRepository絕對不解決問題。 使用CSRF保護標記是檢測併發修改的一個非常有趣的想法。我會試一試。 – user7252656