WebSessionIdResolver now returns List of ids

Issue: #64
This commit is contained in:
Rossen Stoyanchev 2016-03-03 22:32:03 -05:00
parent dbc6478b8a
commit ca7aeaae35
4 changed files with 31 additions and 28 deletions

View File

@ -18,13 +18,11 @@ package org.springframework.web.server.session;
import java.time.Duration; import java.time.Duration;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.stream.Collectors;
import java.util.Optional;
import org.springframework.http.HttpCookie; import org.springframework.http.HttpCookie;
import org.springframework.http.ServerHttpCookie; import org.springframework.http.ServerHttpCookie;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
@ -77,10 +75,13 @@ public class CookieWebSessionIdResolver implements WebSessionIdResolver {
@Override @Override
public Optional<String> resolveSessionId(ServerWebExchange exchange) { public List<String> resolveSessionId(ServerWebExchange exchange) {
MultiValueMap<String, HttpCookie> cookieMap = exchange.getRequest().getCookies(); MultiValueMap<String, HttpCookie> cookieMap = exchange.getRequest().getCookies();
HttpCookie cookie = cookieMap.getFirst(getCookieName()); List<HttpCookie> cookies = cookieMap.get(getCookieName());
return (cookie != null ? Optional.of(cookie.getValue()) : Optional.empty()); if (cookies == null) {
return Collections.emptyList();
}
return cookies.stream().map(HttpCookie::getValue).collect(Collectors.toList());
} }
@Override @Override

View File

@ -17,9 +17,10 @@ package org.springframework.web.server.session;
import java.time.Clock; import java.time.Clock;
import java.time.Instant; import java.time.Instant;
import java.util.Optional; import java.util.List;
import java.util.UUID; import java.util.UUID;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -98,9 +99,8 @@ public class DefaultWebSessionManager implements WebSessionManager {
@Override @Override
public Mono<WebSession> getSession(ServerWebExchange exchange) { public Mono<WebSession> getSession(ServerWebExchange exchange) {
return Mono.fromCallable(() -> getSessionIdResolver().resolveSessionId(exchange)) return Flux.fromIterable(getSessionIdResolver().resolveSessionId(exchange))
.where(Optional::isPresent) .next()
.map(Optional::get)
.then(this.sessionStore::retrieveSession) .then(this.sessionStore::retrieveSession)
.then(session -> validateSession(exchange, session)) .then(session -> validateSession(exchange, session))
.otherwiseIfEmpty(createSession(exchange)) .otherwiseIfEmpty(createSession(exchange))
@ -147,8 +147,8 @@ public class DefaultWebSessionManager implements WebSessionManager {
// Force explicit start // Force explicit start
session.start(); session.start();
Optional<String> requestedId = getSessionIdResolver().resolveSessionId(exchange); List<String> requestedIds = getSessionIdResolver().resolveSessionId(exchange);
if (!requestedId.isPresent() || !session.getId().equals(requestedId.get())) { if (requestedIds.isEmpty() || !session.getId().equals(requestedIds.get(0))) {
this.sessionIdResolver.setSessionId(exchange, session.getId()); this.sessionIdResolver.setSessionId(exchange, session.getId());
} }
return this.sessionStore.storeSession(session); return this.sessionStore.storeSession(session);

View File

@ -15,7 +15,7 @@
*/ */
package org.springframework.web.server.session; package org.springframework.web.server.session;
import java.util.Optional; import java.util.List;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
@ -31,11 +31,11 @@ import org.springframework.web.server.ServerWebExchange;
public interface WebSessionIdResolver { public interface WebSessionIdResolver {
/** /**
* Resolve the session id associated with the request. * Resolve the session id's associated with the request.
* @param exchange the current exchange * @param exchange the current exchange
* @return the session id if present * @return the session id's or an empty list
*/ */
Optional<String> resolveSessionId(ServerWebExchange exchange); List<String> resolveSessionId(ServerWebExchange exchange);
/** /**
* Send the given session id to the client or if the session id is "null" * Send the given session id to the client or if the session id is "null"

View File

@ -19,7 +19,9 @@ import java.net.URI;
import java.time.Clock; import java.time.Clock;
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.util.Optional; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -27,9 +29,9 @@ import org.junit.Test;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.MockServerHttpRequest; import org.springframework.http.server.reactive.MockServerHttpRequest;
import org.springframework.http.server.reactive.MockServerHttpResponse; import org.springframework.http.server.reactive.MockServerHttpResponse;
import org.springframework.web.server.adapter.DefaultServerWebExchange;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebSession; import org.springframework.web.server.WebSession;
import org.springframework.web.server.adapter.DefaultServerWebExchange;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@ -64,7 +66,7 @@ public class DefaultWebSessionManagerTests {
@Test @Test
public void getSessionPassive() throws Exception { public void getSessionPassive() throws Exception {
this.idResolver.setIdToResolve(Optional.empty()); this.idResolver.setIdsToResolve(Collections.emptyList());
WebSession session = this.manager.getSession(this.exchange).get(); WebSession session = this.manager.getSession(this.exchange).get();
assertNotNull(session); assertNotNull(session);
@ -79,7 +81,7 @@ public class DefaultWebSessionManagerTests {
@Test @Test
public void getSessionForceCreate() throws Exception { public void getSessionForceCreate() throws Exception {
this.idResolver.setIdToResolve(Optional.empty()); this.idResolver.setIdsToResolve(Collections.emptyList());
WebSession session = this.manager.getSession(this.exchange).get(); WebSession session = this.manager.getSession(this.exchange).get();
session.start(); session.start();
session.save(); session.save();
@ -92,7 +94,7 @@ public class DefaultWebSessionManagerTests {
@Test @Test
public void getSessionAddAttribute() throws Exception { public void getSessionAddAttribute() throws Exception {
this.idResolver.setIdToResolve(Optional.empty()); this.idResolver.setIdsToResolve(Collections.emptyList());
WebSession session = this.manager.getSession(this.exchange).get(); WebSession session = this.manager.getSession(this.exchange).get();
session.getAttributes().put("foo", "bar"); session.getAttributes().put("foo", "bar");
session.save(); session.save();
@ -105,7 +107,7 @@ public class DefaultWebSessionManagerTests {
DefaultWebSession existing = new DefaultWebSession("1", Clock.systemDefaultZone()); DefaultWebSession existing = new DefaultWebSession("1", Clock.systemDefaultZone());
this.manager.getSessionStore().storeSession(existing); this.manager.getSessionStore().storeSession(existing);
this.idResolver.setIdToResolve(Optional.of("1")); this.idResolver.setIdsToResolve(Collections.singletonList("1"));
WebSession actual = this.manager.getSession(this.exchange).get(); WebSession actual = this.manager.getSession(this.exchange).get();
assertSame(existing, actual); assertSame(existing, actual);
} }
@ -118,7 +120,7 @@ public class DefaultWebSessionManagerTests {
existing.setLastAccessTime(Instant.now(clock).minus(Duration.ofMinutes(31))); existing.setLastAccessTime(Instant.now(clock).minus(Duration.ofMinutes(31)));
this.manager.getSessionStore().storeSession(existing); this.manager.getSessionStore().storeSession(existing);
this.idResolver.setIdToResolve(Optional.of("1")); this.idResolver.setIdsToResolve(Collections.singletonList("1"));
WebSession actual = this.manager.getSession(this.exchange).get(); WebSession actual = this.manager.getSession(this.exchange).get();
assertNotSame(existing, actual); assertNotSame(existing, actual);
} }
@ -126,13 +128,13 @@ public class DefaultWebSessionManagerTests {
private static class TestWebSessionIdResolver implements WebSessionIdResolver { private static class TestWebSessionIdResolver implements WebSessionIdResolver {
private Optional<String> idToResolve = Optional.empty(); private List<String> idsToResolve = new ArrayList<>();
private String id = null; private String id = null;
public void setIdToResolve(Optional<String> idToResolve) { public void setIdsToResolve(List<String> idsToResolve) {
this.idToResolve = idToResolve; this.idsToResolve = idsToResolve;
} }
public String getId() { public String getId() {
@ -140,8 +142,8 @@ public class DefaultWebSessionManagerTests {
} }
@Override @Override
public Optional<String> resolveSessionId(ServerWebExchange exchange) { public List<String> resolveSessionId(ServerWebExchange exchange) {
return this.idToResolve; return this.idsToResolve;
} }
@Override @Override