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

2022-09-02 01:47:11

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

由于Spring Security已经处理HTTP会话,因此Spring Security要处理的最佳实践是什么?Spring是否提供任何OOTB?或者它是否具有将会话信息存储到数据库的选项? ?SecurityContextPersistenceFilter


答案 1

您可以将容器配置为使用 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。它将自动跨集群复制会话对象。


答案 2

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


推荐