WebSession 集成
Spring Session 为 Spring WebFlux 的 WebSession
提供了透明集成。这意味着你可以将 WebSession
实现切换为由 Spring Session 支持的实现。
为什么选择 Spring Session 和 WebSession?
我们已经提到过,Spring Session 与 Spring WebFlux 的 WebSession
提供了透明集成,但这样做的好处是什么呢?与 HttpSession
一样,Spring Session 使得支持集群会话变得非常简单,而无需依赖特定于应用程序容器的解决方案。
使用 Redis 的 WebSession
通过使用Spring Session的ReactiveSessionRepository
支持的WebSessionManager
实现来启用与WebSession
一起使用Spring Session。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 服务器。我们配置连接以在默认端口(6379)上连接到本地主机。有关配置 Spring Data Redis 的更多信息,请参阅 参考文档。
WebSession 集成的工作原理
与 Servlet API 及其 HttpSession
相比,Spring Session 与 Spring WebFlux 及其 WebSession
的集成要容易得多。Spring WebFlux 提供了 WebSessionStore
API,该 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 参考文档。