如何让Spring Security将HTTP Session存储在数据库中以在多个服务器上使用Web应用程序?

好的,我希望我的Web应用程序能够在多个Web服务器上使用HTTP会话。 我也不能使用粘性会话或会话复制!

Spring Security处理HTTP会话的最佳实践是什么? Spring提供OOTB吗? 或者它是否有选项将会话信息存储到数据库? SecurityContextPersistenceFilter

您可以将容器配置为使用JDBC将会话持久保存到数据库。 如果使用tomcat,则可以配置JDBC会话持久性提供程序。 我假设你也可以在其他容器上做类似的事情。

我已经记录了在我的博客上设置tomcat JDBC会话持久性的步骤: http : //gerrydevstory.com/2013/08/21/tomcat-7-jdbc-session-persistence/

总之,您需要在context.xml上进行如下配置:

    

但是, maxIdleBackup="10"表示只有在10秒不活动后才会将会话刷新到jdbc中。 我不知道将它设置为0是否有效。

我想在没有粘性负载均衡器会话的情况下完成整个工作会很困难,例如:如何确保在下一个请求之前刷新会话更新? 您无法保证下一个请求将由同一节点提供服务。

也许另一种选择是如果你可以破解你自己/那里有另一个会话提供者库直接写入数据库。

编辑2014年5月21日:

我只是想出了hazelcast WM是一个很棒的库来进行点对点会话复制 。 您需要做的就是在类路径中包含hazelcast jar,在web.xml上设置hazelcast-wm作为filter并配置hazelcast。 它将自动复制跨群集的会话对象。

貌似新的春季项目可以轻松做到这一点http://docs.spring.io/spring-session/docs/current/reference/html5/guides/httpsession.html