此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Session 3.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Session 3.3.1! |
Spring Session 提供与 Spring WebFlux 的透明集成。
这意味着您可以使用 Spring Session 支持的实现来切换实现。WebSession
WebSession
为什么选择 Spring Session 和 WebSession?
我们已经提到 Spring Session 提供了与 Spring WebFlux 的透明集成,但我们从中得到了什么好处?
与 一样,Spring Session 使得支持集群会话变得简单,而不必绑定到特定于应用程序容器的解决方案。WebSession
HttpSession
使用 Redis 的 WebSession
通过注册由 Spring Session 的 .
Spring 配置负责创建一个将实现替换为 Spring Session 支持的实现。
为此,请添加以下 Spring 配置:WebSession
WebSessionManager
ReactiveSessionRepository
WebSessionManager
WebSession
@EnableRedisWebSession (1)
public class SessionConfiguration {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(); (2)
}
}
1 | 注解创建名为 的 Spring Bean。该 Bean 实现了 .
这就是负责替换Spring Session支持的实现的内容。
在这种情况下,Spring Session 由 Redis 提供支持。@EnableRedisWebSession webSessionManager WebSessionManager WebSession |
2 | 我们创建一个将 Spring Session 连接到 Redis 服务器。
我们将连接配置为在默认端口 (6379) 上连接到 localhost
有关配置 Spring Data Redis 的更多信息,请参阅参考文档。RedisConnectionFactory |
1 | 注解创建名为 的 Spring Bean。该 Bean 实现了 .
这就是负责替换Spring Session支持的实现的内容。
在这种情况下,Spring Session 由 Redis 提供支持。@EnableRedisWebSession webSessionManager WebSessionManager WebSession |
2 | 我们创建一个将 Spring Session 连接到 Redis 服务器。
我们将连接配置为在默认端口 (6379) 上连接到 localhost
有关配置 Spring Data Redis 的更多信息,请参阅参考文档。RedisConnectionFactory |
WebSession 集成的工作原理
与 Servlet API 及其 .
Spring WebFlux 提供了 API,它提供了持久化的策略。WebSession
HttpSession
WebSessionStore
WebSession
本节介绍 Spring Session 如何提供与 的透明集成。我们提供此内容,以便您可以了解幕后发生的事情。此功能已集成,您无需自行实现此逻辑。WebSession |
首先,我们创建一个委托给 Spring Session 的 .
它看起来像下面这样:SpringSessionWebSession
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 检测到,需要将此自定义注册为名为 的 bean 。
有关 Spring WebFlux 的其他信息,请参阅 Spring Framework 参考文档。WebSessionStore
ApplicationContext
webSessionManager
本节介绍 Spring Session 如何提供与 的透明集成。我们提供此内容,以便您可以了解幕后发生的事情。此功能已集成,您无需自行实现此逻辑。WebSession |