【问题标题】:Spring reactive WebSession with JDBC (or R2DBC)使用 JDBC(或 R2DBC)的 Spring 反应式 WebSession
【发布时间】:2020-07-06 15:07:00
【问题描述】:

我正在尝试将基于 Servlet 的应用程序迁移到 Webflux,但遇到了会话管理问题。我一直在使用带有 Jdbc 实现(由 PostgreSQL 支持)的 Spring 会话,我的配置如下所示:

    @Configuration
    @EnableSpringHttpSession
    public static class SessionConfig {

        @Bean
        public MapSessionRepository sessionRepository() {
            return new MapSessionRepository(new ConcurrentHashMap<>());
        }
    }

现在,正如我对documentation 的正确理解,基于servlet 的HttpSession 已被WebSession 替换,我需要提供如下配置:

    @Configuration
    @EnableSpringWebSession
    public class SessionConfig {

        @Bean
        public ReactiveSessionRepository sessionRepository() {
            return ???
        }
    }

但我找不到对关系数据库的任何支持,因为org.springframework.session.ReactiveSessionRepository(来自"org.springframework.session:spring-session-core:2.2.2.RELEASE")只有 2 个实现:

  • 基础一-ReactiveMapSessionRepository
  • 基于Redis的一种-ReactiveRedisSessionRepository

但不幸的是,它们不能满足我的要求。

我也找不到任何关于"org.springframework.session:spring-session-jdbc"WebSessions 的支持和新的 R2DBC 的注释。


是否可以通过关系数据库(例如 Postgres)支持 WebSessions,如果可以,我该如何实现(我应该使用哪个实现)?我知道存在一些问题对关系数据库的非阻塞操作支持,但我想知道我是否遗漏了一些东西,但它仍然是可能的。

提前致谢

【问题讨论】:

    标签: spring-security spring-session


    【解决方案1】:

    Spring Session 没有提供ReactiveSessionRepository 的 JDBC 实现是正确的,因为 JDBC 具有阻塞性质。

    在构建响应式 Web 应用程序时,目前只有 Redis 和 MongoDB 可以自动配置。

    如果您需要将 JDBC 与 WebFlux 一起使用,可以通过配置 ReactiveSessionRepository 的自定义实现,通过关系数据库支持 WebSession

    首先,请确保您考虑 WebFlux 是否适合您的用例。 来自Spring Framework documentation

    如果您要使用阻塞持久性 API(JPA、JDBC)或网络 API,那么 Spring MVC 至少是常见架构的最佳选择。使用 Reactor 和 RxJava 在单独的线程上执行阻塞调用在技术上是可行的,但您不会充分利用非阻塞 Web 堆栈。

    如果您确实实现了自定义 ReactiveSessionRepository,您可能会发现 Spring Session 文档中的 this section 很有用。

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2021-08-14
      • 2021-05-12
      • 1970-01-01
      • 2021-03-10
      • 2022-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      相关资源
      最近更新 更多