此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Session 3.4.0spring-doc.cn

WebSession 集成

Spring Session 提供与 Spring WebFlux 的 . 这意味着你可以用 Spring Session 支持的实现来切换实现。WebSessionWebSessionspring-doc.cn

为什么选择 Spring Session 和 WebSession?

我们已经提到 Spring Session 提供了与 Spring WebFlux 的透明集成,但是我们从中得到了什么好处呢? 与 Spring Session 一样,支持集群会话变得轻而易举,而无需绑定到特定于应用程序容器的解决方案。WebSessionHttpSessionspring-doc.cn

使用 Redis 的 WebSession

使用 Spring Session 是通过注册 Spring Session 的 . Spring 配置负责创建一个,将 implementation 替换为 Spring Session 支持的 implementation。 为此,请添加以下 Spring Configuration:WebSessionWebSessionManagerReactiveSessionRepositoryWebSessionManagerWebSessionspring-doc.cn

@EnableRedisWebSession (1)
public class SessionConfiguration {

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

}
1 该注解将创建一个名为 .该 Bean 实现了 . 这就是负责替换由 Spring Session 支持的实现的内容。 在这种情况下, Spring Session 由 Redis 提供支持。@EnableRedisWebSessionwebSessionManagerWebSessionManagerWebSession
2 我们创建一个将 Spring Session 连接到 Redis 服务器。 我们将连接配置为连接到默认端口上的 localhost (6379) 有关配置 Spring Data Redis 的更多信息,请参阅参考文档RedisConnectionFactory

WebSession 集成的工作原理

与 Servlet API 及其 . Spring WebFlux 提供了 API,它提供了一种用于持久化的策略。WebSessionHttpSessionWebSessionStoreWebSessionspring-doc.cn

本节介绍 Spring Session 如何提供与 的透明集成。我们提供这些内容是为了让您了解幕后发生的事情。此功能已集成,您无需自己实现此 logic。WebSession

首先,我们创建一个自定义,该自定义委托给 Spring Session 的 . 它看起来像下面这样:SpringSessionWebSessionSessionspring-doc.cn

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
}

接下来,我们创建一个自定义,该自定义委托给 并包装到自定义实现中,如下面的清单所示:WebSessionStoreReactiveSessionRepositorySessionWebSessionspring-doc.cn

public class SpringSessionWebSessionStore<S extends Session> implements WebSessionStore {

	private final ReactiveSessionRepository<S> sessions;

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

	// ...
}

要被 Spring WebFlux 检测到,需要将此自定义注册为名为 . 有关 Spring WebFlux 的更多信息,请参阅 Spring Framework 参考文档WebSessionStoreApplicationContextwebSessionManagerspring-doc.cn