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

Jax*_*xox 19 java session spring-security

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

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

ger*_*tan 10

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

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

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

<Manager className="org.apache.catalina.session.PersistentManager"
         maxIdleBackup="10">
  <Store className="org.apache.catalina.session.JDBCStore"
         connectionURL="jdbc:mysql://localhost/mytomcat?user=root"
         driverName="com.mysql.jdbc.Driver"
         sessionAppCol="app_name"
         sessionDataCol="session_data"
         sessionIdCol="session_id"
         sessionLastAccessedCol="last_access"
         sessionMaxInactiveCol="max_inactive"
         sessionTable="tomcat_sessions"
         sessionValidCol="valid_session" />
</Manager>
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑2014年5月21日:

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


Yur*_*ura 7

看起来像新的春季项目可以轻松做到这一点 https://docs.spring.io/spring-session/docs/current/reference/html5/