跳到主要内容
版本:4.1.1

WebSession 集成

Doubao 中英对照 WebSession Integration

Spring Session 提供与 Spring WebFlux 的 WebSession 的透明集成。这意味着你可以将 WebSession 实现替换为由 Spring Session 支持的实现。

为什么使用 Spring Session 与 WebSession?​

我们已经提到 Spring Session 提供与 Spring WebFlux 的 WebSession 的透明集成,但我们从中获得了什么好处?与 HttpSession 一样,Spring Session 让支持集群会话变得非常简单,而无需绑定到特定于应用容器的解决方案。

将 WebSession 与 Redis 结合使用​

通过注册一个由 Spring Session 的 ReactiveSessionRepository 支持的 WebSessionManager 实现,来启用将 Spring Session 与 WebSession 结合使用。Spring 配置负责创建一个 WebSessionManager,将 WebSession 实现替换为由 Spring Session 支持的实现。为此,添加以下 Spring 配置:

@EnableRedisWebSession 1
public class SessionConfiguration {

@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(); 2
}

}
  • @EnableRedisWebSession 注解创建一个名为 webSessionManager 的 Spring bean。该 bean 实现了 WebSessionManager。它负责将 WebSession 实现替换为由 Spring Session 支持。在本例中,Spring Session 由 Redis 支持。

  • 我们创建一个 RedisConnectionFactory,将 Spring Session 连接到 Redis 服务器。我们将连接配置为连接到 localhost 的默认端口(6379)。有关配置 Spring Data Redis 的更多信息,请参阅参考文档。

WebSession 集成的工作原理​

与 Servlet API 及其 HttpSession 相比,Spring Session 集成 Spring WebFlux 及其 WebSession 要容易得多。Spring WebFlux 提供了 WebSessionStore API,它提供了一种持久化 WebSession 的策略。

备注

本节描述 Spring Session 如何提供与 WebSession 的透明集成。我们提供这些内容是为了让你了解底层发生的事情。此功能已经集成,你无需自己实现此逻辑。

首先,我们创建一个自定义的 SpringSessionWebSession,它委托给 Spring Session 的 Session。它大致如下:

public class SpringSessionWebSession implements WebSession {

enum State {
NEW, STARTED
}

private final S session;

private AtomicReference<State> state = new AtomicReference<>();

SpringSessionWebSession(S session, State state) {
this.session = session;
this.state.set(state);
}

@Override
public void start() {
this.state.compareAndSet(State.NEW, State.STARTED);
}

@Override
public boolean isStarted() {
State value = this.state.get();
return (State.STARTED.equals(value)
|| (State.NEW.equals(value) && !this.session.getAttributes().isEmpty()));
}

@Override
public Mono<Void> changeSessionId() {
return Mono.defer(() -> {
this.session.changeSessionId();
return save();
});
}

// ... other methods delegate to the original Session
}

接下来,我们创建一个自定义的 WebSessionStore,它委托给 ReactiveSessionRepository 并将 Session 包装到自定义的 WebSession 实现中,如以下清单所示:

public class SpringSessionWebSessionStore<S extends Session> implements WebSessionStore {

private final ReactiveSessionRepository<S> sessions;

public SpringSessionWebSessionStore(ReactiveSessionRepository<S> reactiveSessionRepository) {
this.sessions = reactiveSessionRepository;
}

// ...
}

为了被 Spring WebFlux 检测到,这个自定义的 WebSessionStore 需要以名为 webSessionManager 的 bean 注册到 ApplicationContext。有关 Spring WebFlux 的更多信息,请参阅 Spring Framework Reference Documentation。