From 2f2546c8a454bd63181d793e31acdf0252b3ff4c Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 30 Jun 2016 16:00:49 -0400 Subject: [PATCH] Simplify initialization of WebSession Mono The DefaultWebSessionManager now uses Mono.defer to protect the call to getSession from parsing session cookies immediately. This allows pre-initializing the Mono upfront vs using a lock. --- .../adapter/DefaultServerWebExchange.java | 17 ++--------------- .../session/DefaultWebSessionManager.java | 13 +++++++------ 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/spring-web-reactive/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java b/spring-web-reactive/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java index 295db4f880..bbd7342fca 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/server/adapter/DefaultServerWebExchange.java @@ -39,15 +39,9 @@ public class DefaultServerWebExchange implements ServerWebExchange { private final ServerHttpResponse response; - private final WebSessionManager sessionManager; - - private final Map attributes = new ConcurrentHashMap<>(); - private final Object createSessionLock = new Object(); - - private Mono sessionMono; - + private final Mono sessionMono; public DefaultServerWebExchange(ServerHttpRequest request, ServerHttpResponse response, @@ -58,7 +52,7 @@ public class DefaultServerWebExchange implements ServerWebExchange { Assert.notNull(response, "'sessionManager' is required."); this.request = request; this.response = response; - this.sessionManager = sessionManager; + this.sessionMono = sessionManager.getSession(this).cache(); } @@ -84,13 +78,6 @@ public class DefaultServerWebExchange implements ServerWebExchange { @Override public Mono getSession() { - if (this.sessionMono == null) { - synchronized (this.createSessionLock) { - if (this.sessionMono == null) { - this.sessionMono = this.sessionManager.getSession(this).cache(); - } - } - } return this.sessionMono; } diff --git a/spring-web-reactive/src/main/java/org/springframework/web/server/session/DefaultWebSessionManager.java b/spring-web-reactive/src/main/java/org/springframework/web/server/session/DefaultWebSessionManager.java index 64a5e58b2e..6e51319ac2 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/server/session/DefaultWebSessionManager.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/server/session/DefaultWebSessionManager.java @@ -99,12 +99,13 @@ public class DefaultWebSessionManager implements WebSessionManager { @Override public Mono getSession(ServerWebExchange exchange) { - return Flux.fromIterable(getSessionIdResolver().resolveSessionIds(exchange)) - .concatMap(this.sessionStore::retrieveSession) - .next() - .then(session -> validateSession(exchange, session)) - .otherwiseIfEmpty(createSession(exchange)) - .map(session -> extendSession(exchange, session)); + return Mono.defer(() -> + Flux.fromIterable(getSessionIdResolver().resolveSessionIds(exchange)) + .concatMap(this.sessionStore::retrieveSession) + .next() + .then(session -> validateSession(exchange, session)) + .otherwiseIfEmpty(createSession(exchange)) + .map(session -> extendSession(exchange, session))); } protected Mono validateSession(ServerWebExchange exchange, WebSession session) {