如何使Spring Security将HTTP会话存储在数据库中,以便在多个服务器上使用Web应用程序?
好的,我希望我的 Web 应用能够在多个 Web 服务器上使用 HTTP 会话。我也不能使用粘性会话或会话复制!
由于Spring Security已经处理HTTP会话,因此Spring Security要处理的最佳实践是什么?Spring是否提供任何OOTB?或者它是否具有将会话信息存储到数据库的选项? ?SecurityContextPersistenceFilter
好的,我希望我的 Web 应用能够在多个 Web 服务器上使用 HTTP 会话。我也不能使用粘性会话或会话复制!
由于Spring Security已经处理HTTP会话,因此Spring Security要处理的最佳实践是什么?Spring是否提供任何OOTB?或者它是否具有将会话信息存储到数据库的选项? ?SecurityContextPersistenceFilter
您可以将容器配置为使用 JDBC 将会话持久保存到数据库。如果使用 tomcat,则可以配置 JDBC 会话持久性提供程序。我假设您也可以在其他容器上执行类似操作。
我已经在我的博客上记录了设置tomcat JDBC会话持久性的步骤:http://web.archive.org/web/20160417070959/http://gerrydevstory.com/2013/08/21/tomcat-7-jdbc-session-persistence/
总之,您需要在上下文中进行如下配置.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>
但是,上面表示会话仅在处于非活动状态 10 秒后才会刷新到 jdbc 中。我不知道将其设置为0是否有效。maxIdleBackup="10"
我想如果没有粘性负载均衡器会话,让整个事情变得很难,例如:你如何确保在下一个请求之前刷新会话更新?您无法保证下一个请求将由同一节点提供服务。
也许另一种选择是,如果您可以破解自己/那里有另一个会话提供程序库可以直接写入数据库。
编辑21 May 2014:
我刚刚发现 hazelcast WM 是一个很棒的库,可以进行对等会话复制。您需要做的就是将 hazelcast jar 包含在类路径中,将 hazelcast-wm 设置为 Web 上的过滤器.xml并配置 hazelcast。它将自动跨集群复制会话对象。