2009-02-03 132 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并为所有节点(例如应用程序的数据库)使用共享数据存储。