2009-02-03 157 views
3

我有一個Spring 2.5.6/Flex應用程序設置並運行Spring Security 2.0.4。最近一個負載平衡器(A Foundry ServerIron 4g http://www.foundrynet.com/products/a...ems/si-4g.html)已經到位,現在我得到了跨域錯誤。基本上,負載平衡器正在向myloadbalancer.abc.com發出請求,myrealserver1.abc.com作爲域名返回。 Spring安全性以某種方式將請求轉發給真實服務器。我怎樣才能解決這個問題?負載平衡,Spring Security,ConcurrentSessionFilter

此外ConcurrentSessionFilter不再工作。該應用程序設置爲禁用併發登錄,但該功能在應用程序放入負載平衡器後停止。我相信有多個Oracle應用服務器也可以聚集在一起。我從來沒有處理過羣集或負載平衡器,我也沒有意識到軟件在某些領域必須寫入不同的東西。

這聽起來像是分開的問題,但我需要幫助。

回答

3

關於你的第二個問題:

如果ConcurrentSessionFilter停止工作(即不阻止了併發會話),這可能是由於集羣應用程序容器與粘性會話。

在這樣的設置中,每個羣集的節點獨立工作,不會與其他節點共享狀態。相反,負載平衡器確保現有會話將始終由同一節點提供服務。

現在Spring Security的ConcurrentSessionController通過將會話映射到委託人來工作。控制器本身依靠HttpSessionEventPublisher發送ApplicationEvents開始和終止用戶會話。

如果有人打算打開一個以上的會話,那麼一切都會正常工作,並且結束了他已經打開一個會話的同一個節點。 HttpSessionEventPublisher通知會話創建的併發會話機制,並且驗證將失敗,因爲已經有與該用戶關聯的會話。但是,在不同的節點上,該用戶還沒有會話,因此ConcurrentSessionController不會發出抱怨並且登錄成功。

幸運的是,解決這個問題應該很容易:實現您自己的SessionRegistry併爲所有節點(例如應用程序的數據庫)使用共享數據存儲。