WebSession 整合

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)
	}

}
1 @EnableRedisWebSession 註解建立一個名為 webSessionManager 的 Spring bean。該 bean 實現了 WebSessionManager。這就是負責將 WebSession 實現替換為由 Spring Session 支援的實現。在此例項中,Spring Session 由 Redis 支援。
2 我們建立一個 RedisConnectionFactory,用於將 Spring Session 連線到 Redis 伺服器。我們將連線配置為連線到本地主機上的預設埠 (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 參考文件

© . This site is unofficial and not affiliated with VMware.