parent
dbc6478b8a
commit
ca7aeaae35
|
|
@ -18,13 +18,11 @@ package org.springframework.web.server.session;
|
|||
import java.time.Duration;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.http.HttpCookie;
|
||||
import org.springframework.http.ServerHttpCookie;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
|
@ -77,10 +75,13 @@ public class CookieWebSessionIdResolver implements WebSessionIdResolver {
|
|||
|
||||
|
||||
@Override
|
||||
public Optional<String> resolveSessionId(ServerWebExchange exchange) {
|
||||
public List<String> resolveSessionId(ServerWebExchange exchange) {
|
||||
MultiValueMap<String, HttpCookie> cookieMap = exchange.getRequest().getCookies();
|
||||
HttpCookie cookie = cookieMap.getFirst(getCookieName());
|
||||
return (cookie != null ? Optional.of(cookie.getValue()) : Optional.empty());
|
||||
List<HttpCookie> cookies = cookieMap.get(getCookieName());
|
||||
if (cookies == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return cookies.stream().map(HttpCookie::getValue).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -17,9 +17,10 @@ package org.springframework.web.server.session;
|
|||
|
||||
import java.time.Clock;
|
||||
import java.time.Instant;
|
||||
import java.util.Optional;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
|
@ -98,9 +99,8 @@ public class DefaultWebSessionManager implements WebSessionManager {
|
|||
|
||||
@Override
|
||||
public Mono<WebSession> getSession(ServerWebExchange exchange) {
|
||||
return Mono.fromCallable(() -> getSessionIdResolver().resolveSessionId(exchange))
|
||||
.where(Optional::isPresent)
|
||||
.map(Optional::get)
|
||||
return Flux.fromIterable(getSessionIdResolver().resolveSessionId(exchange))
|
||||
.next()
|
||||
.then(this.sessionStore::retrieveSession)
|
||||
.then(session -> validateSession(exchange, session))
|
||||
.otherwiseIfEmpty(createSession(exchange))
|
||||
|
|
@ -147,8 +147,8 @@ public class DefaultWebSessionManager implements WebSessionManager {
|
|||
// Force explicit start
|
||||
session.start();
|
||||
|
||||
Optional<String> requestedId = getSessionIdResolver().resolveSessionId(exchange);
|
||||
if (!requestedId.isPresent() || !session.getId().equals(requestedId.get())) {
|
||||
List<String> requestedIds = getSessionIdResolver().resolveSessionId(exchange);
|
||||
if (requestedIds.isEmpty() || !session.getId().equals(requestedIds.get(0))) {
|
||||
this.sessionIdResolver.setSessionId(exchange, session.getId());
|
||||
}
|
||||
return this.sessionStore.storeSession(session);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
*/
|
||||
package org.springframework.web.server.session;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
|
|
@ -31,11 +31,11 @@ import org.springframework.web.server.ServerWebExchange;
|
|||
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
|
||||
* @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"
|
||||
|
|
|
|||
|
|
@ -19,7 +19,9 @@ import java.net.URI;
|
|||
import java.time.Clock;
|
||||
import java.time.Duration;
|
||||
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.Test;
|
||||
|
|
@ -27,9 +29,9 @@ import org.junit.Test;
|
|||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.server.reactive.MockServerHttpRequest;
|
||||
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.WebSession;
|
||||
import org.springframework.web.server.adapter.DefaultServerWebExchange;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
|
|
@ -64,7 +66,7 @@ public class DefaultWebSessionManagerTests {
|
|||
|
||||
@Test
|
||||
public void getSessionPassive() throws Exception {
|
||||
this.idResolver.setIdToResolve(Optional.empty());
|
||||
this.idResolver.setIdsToResolve(Collections.emptyList());
|
||||
WebSession session = this.manager.getSession(this.exchange).get();
|
||||
|
||||
assertNotNull(session);
|
||||
|
|
@ -79,7 +81,7 @@ public class DefaultWebSessionManagerTests {
|
|||
|
||||
@Test
|
||||
public void getSessionForceCreate() throws Exception {
|
||||
this.idResolver.setIdToResolve(Optional.empty());
|
||||
this.idResolver.setIdsToResolve(Collections.emptyList());
|
||||
WebSession session = this.manager.getSession(this.exchange).get();
|
||||
session.start();
|
||||
session.save();
|
||||
|
|
@ -92,7 +94,7 @@ public class DefaultWebSessionManagerTests {
|
|||
|
||||
@Test
|
||||
public void getSessionAddAttribute() throws Exception {
|
||||
this.idResolver.setIdToResolve(Optional.empty());
|
||||
this.idResolver.setIdsToResolve(Collections.emptyList());
|
||||
WebSession session = this.manager.getSession(this.exchange).get();
|
||||
session.getAttributes().put("foo", "bar");
|
||||
session.save();
|
||||
|
|
@ -105,7 +107,7 @@ public class DefaultWebSessionManagerTests {
|
|||
DefaultWebSession existing = new DefaultWebSession("1", Clock.systemDefaultZone());
|
||||
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();
|
||||
assertSame(existing, actual);
|
||||
}
|
||||
|
|
@ -118,7 +120,7 @@ public class DefaultWebSessionManagerTests {
|
|||
existing.setLastAccessTime(Instant.now(clock).minus(Duration.ofMinutes(31)));
|
||||
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();
|
||||
assertNotSame(existing, actual);
|
||||
}
|
||||
|
|
@ -126,13 +128,13 @@ public class DefaultWebSessionManagerTests {
|
|||
|
||||
private static class TestWebSessionIdResolver implements WebSessionIdResolver {
|
||||
|
||||
private Optional<String> idToResolve = Optional.empty();
|
||||
private List<String> idsToResolve = new ArrayList<>();
|
||||
|
||||
private String id = null;
|
||||
|
||||
|
||||
public void setIdToResolve(Optional<String> idToResolve) {
|
||||
this.idToResolve = idToResolve;
|
||||
public void setIdsToResolve(List<String> idsToResolve) {
|
||||
this.idsToResolve = idsToResolve;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
|
|
@ -140,8 +142,8 @@ public class DefaultWebSessionManagerTests {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Optional<String> resolveSessionId(ServerWebExchange exchange) {
|
||||
return this.idToResolve;
|
||||
public List<String> resolveSessionId(ServerWebExchange exchange) {
|
||||
return this.idsToResolve;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Reference in New Issue