Skip to content

Commit 167ddc7

Browse files
rwinchrstoyanchev
authored andcommitted
Polish HeaderWebSessionIdResolver
Use constant for default header name and make getHeaderName private. Also switch HeaderWebSessionIdResolverTests to unit tests rather than testing with DefaultWebSessionManager. Issue: SPR-15917
1 parent dcdb0b4 commit 167ddc7

File tree

2 files changed

+93
-128
lines changed

2 files changed

+93
-128
lines changed

spring-web/src/main/java/org/springframework/web/server/session/HeaderWebSessionIdResolver.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,33 +26,30 @@
2626
* Request and response header-based {@link WebSessionIdResolver}.
2727
*
2828
* @author Greg Turnquist
29+
* @author Rob Winch
2930
* @since 5.0
3031
*/
3132
public class HeaderWebSessionIdResolver implements WebSessionIdResolver {
3233

33-
private String headerName = "SESSION";
34+
/**
35+
* The default header name
36+
*/
37+
public static final String DEFAULT_HEADER_NAME = "SESSION";
3438

39+
private String headerName = DEFAULT_HEADER_NAME;
3540

3641
/**
3742
* Set the name of the session header to use for the session id.
3843
* The name is used to extract the session id from the request headers as
3944
* well to set the session id on the response headers.
40-
* <p>By default set to {@literal "SESSION"}.
45+
* <p>By default set to {@code DEFAULT_HEADER_NAME}
4146
* @param headerName the header name
4247
*/
4348
public void setHeaderName(String headerName) {
4449
Assert.hasText(headerName, "'headerName' must not be empty.");
4550
this.headerName = headerName;
4651
}
4752

48-
/**
49-
* Return the configured header name.
50-
*/
51-
public String getHeaderName() {
52-
return this.headerName;
53-
}
54-
55-
5653
@Override
5754
public List<String> resolveSessionIds(ServerWebExchange exchange) {
5855
HttpHeaders headers = exchange.getRequest().getHeaders();
@@ -70,4 +67,11 @@ public void expireSession(ServerWebExchange exchange) {
7067
this.setSessionId(exchange, "");
7168
}
7269

70+
/**
71+
* Return the configured header name.
72+
* @return the configured header name
73+
*/
74+
private String getHeaderName() {
75+
return this.headerName;
76+
}
7377
}

spring-web/src/test/java/org/springframework/web/server/session/HeaderWebSessionIdResolverTests.java

Lines changed: 79 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -15,170 +15,131 @@
1515
*/
1616
package org.springframework.web.server.session;
1717

18-
import java.time.Clock;
19-
import java.time.Duration;
20-
import java.time.Instant;
21-
import java.time.ZoneId;
22-
import java.util.UUID;
23-
2418
import org.junit.Before;
2519
import org.junit.Test;
26-
import reactor.core.publisher.Mono;
27-
28-
import org.springframework.http.codec.ServerCodecConfigurer;
2920
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
30-
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
3121
import org.springframework.web.server.ServerWebExchange;
32-
import org.springframework.web.server.WebSession;
33-
import org.springframework.web.server.adapter.DefaultServerWebExchange;
34-
import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver;
3522

36-
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
37-
import static org.hamcrest.core.Is.is;
38-
import static org.hamcrest.core.IsCollectionContaining.hasItem;
23+
import java.util.Arrays;
24+
import java.util.List;
25+
3926
import static org.junit.Assert.assertEquals;
40-
import static org.junit.Assert.assertFalse;
41-
import static org.junit.Assert.assertNotNull;
42-
import static org.junit.Assert.assertNotSame;
43-
import static org.junit.Assert.assertNull;
44-
import static org.junit.Assert.assertThat;
27+
import static org.junit.Assert.assertTrue;
4528

4629
/**
4730
* Tests using {@link HeaderWebSessionIdResolver}.
4831
*
4932
* @author Greg Turnquist
33+
* @author Rob Winch
5034
*/
5135
public class HeaderWebSessionIdResolverTests {
52-
53-
private static final Clock CLOCK = Clock.system(ZoneId.of("GMT"));
54-
55-
5636
private HeaderWebSessionIdResolver idResolver;
5737

58-
private DefaultWebSessionManager manager;
59-
6038
private ServerWebExchange exchange;
6139

62-
6340
@Before
6441
public void setUp() {
6542
this.idResolver = new HeaderWebSessionIdResolver();
66-
this.manager = new DefaultWebSessionManager();
67-
this.manager.setSessionIdResolver(this.idResolver);
43+
this.exchange = MockServerHttpRequest.get("/path").toExchange();
44+
}
6845

69-
MockServerHttpRequest request = MockServerHttpRequest.get("/path").build();
70-
MockServerHttpResponse response = new MockServerHttpResponse();
46+
@Test
47+
public void expireWhenValidThenSetsEmptyHeader() {
48+
this.idResolver.expireSession(this.exchange);
7149

72-
this.exchange = new DefaultServerWebExchange(request, response, this.manager,
73-
ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
50+
assertEquals(Arrays.asList(""),
51+
this.exchange.getResponse().getHeaders().get(HeaderWebSessionIdResolver.DEFAULT_HEADER_NAME));
7452
}
7553

7654
@Test
77-
public void getSessionWithoutStarting() throws Exception {
78-
WebSession session = this.manager.getSession(this.exchange).block();
79-
session.save();
55+
public void expireWhenMultipleInvocationThenSetsSingleEmptyHeader() {
56+
this.idResolver.expireSession(this.exchange);
57+
58+
this.idResolver.expireSession(this.exchange);
8059

81-
assertFalse(session.isStarted());
82-
assertFalse(session.isExpired());
83-
assertNull(this.manager.getSessionStore().retrieveSession(session.getId()).block());
60+
assertEquals(Arrays.asList(""),
61+
this.exchange.getResponse().getHeaders().get(HeaderWebSessionIdResolver.DEFAULT_HEADER_NAME));
8462
}
8563

8664
@Test
87-
public void startSessionExplicitly() throws Exception {
88-
WebSession session = this.manager.getSession(this.exchange).block();
89-
session.start();
90-
session.save().block();
91-
92-
assertThat(this.exchange.getResponse().getHeaders().containsKey("SESSION"), is(true));
93-
assertThat(this.exchange.getResponse().getHeaders().get("SESSION"), hasSize(1));
94-
assertThat(this.exchange.getResponse().getHeaders().get("SESSION"), hasItem(session.getId()));
65+
public void expireWhenAfterSetSessionIdThenSetsEmptyHeader() {
66+
this.idResolver.setSessionId(this.exchange, "123");
67+
68+
this.idResolver.expireSession(this.exchange);
69+
70+
assertEquals(Arrays.asList(""),
71+
this.exchange.getResponse().getHeaders().get(HeaderWebSessionIdResolver.DEFAULT_HEADER_NAME));
9572
}
9673

9774
@Test
98-
public void startSessionImplicitly() throws Exception {
99-
WebSession session = this.manager.getSession(this.exchange).block();
100-
session.getAttributes().put("foo", "bar");
101-
session.save();
75+
public void setSessionIdWhenValidThenSetsHeader() {
76+
String id = "123";
77+
78+
this.idResolver.setSessionId(this.exchange, id);
10279

103-
assertNotNull(this.exchange.getResponse().getHeaders().get("SESSION"));
80+
assertEquals(Arrays.asList(id),
81+
this.exchange.getResponse().getHeaders().get(HeaderWebSessionIdResolver.DEFAULT_HEADER_NAME));
10482
}
10583

10684
@Test
107-
public void existingSession() throws Exception {
108-
UUID sessionId = UUID.randomUUID();
109-
DefaultWebSession existing = createDefaultWebSession(sessionId);
110-
this.manager.getSessionStore().storeSession(existing);
111-
112-
this.exchange = this.exchange.mutate()
113-
.request(this.exchange.getRequest().mutate()
114-
.header("SESSION", sessionId.toString())
115-
.build())
116-
.build();
117-
118-
WebSession actual = this.manager.getSession(this.exchange).block();
119-
assertNotNull(actual);
120-
assertEquals(existing.getId(), actual.getId());
85+
public void setSessionIdWhenMultipleThenSetsSingleHeader() {
86+
String id = "123";
87+
this.idResolver.setSessionId(this.exchange, "overriddenByNextInvocation");
88+
89+
this.idResolver.setSessionId(this.exchange, id);
90+
91+
assertEquals(Arrays.asList(id),
92+
this.exchange.getResponse().getHeaders().get(HeaderWebSessionIdResolver.DEFAULT_HEADER_NAME));
12193
}
12294

12395
@Test
124-
public void existingSessionIsExpired() throws Exception {
125-
UUID sessionId = UUID.randomUUID();
126-
DefaultWebSession existing = createDefaultWebSession(sessionId);
127-
existing.start();
128-
Instant lastAccessTime = Instant.now(CLOCK).minus(Duration.ofMinutes(31));
129-
existing = new DefaultWebSession(existing, lastAccessTime, s -> Mono.empty());
130-
this.manager.getSessionStore().storeSession(existing);
131-
132-
this.exchange = this.exchange.mutate()
133-
.request(this.exchange.getRequest().mutate()
134-
.header("SESSION", sessionId.toString())
135-
.build())
136-
.build();
137-
138-
WebSession actual = this.manager.getSession(this.exchange).block();
139-
assertNotSame(existing, actual);
96+
public void setSessionIdWhenCustomHeaderNameThenSetsHeader() {
97+
String headerName = "x-auth";
98+
String id = "123";
99+
this.idResolver.setHeaderName(headerName);
100+
101+
this.idResolver.setSessionId(this.exchange, id);
102+
103+
assertEquals(Arrays.asList(id),
104+
this.exchange.getResponse().getHeaders().get(headerName));
140105
}
141106

142-
@Test
143-
public void multipleSessionIds() throws Exception {
144-
UUID sessionId = UUID.randomUUID();
145-
DefaultWebSession existing = createDefaultWebSession(sessionId);
146-
this.manager.getSessionStore().storeSession(existing);
147-
this.manager.getSessionStore().storeSession(createDefaultWebSession(UUID.randomUUID()));
148-
this.manager.getSessionStore().storeSession(createDefaultWebSession(UUID.randomUUID()));
149-
150-
this.exchange = this.exchange.mutate()
151-
.request(this.exchange.getRequest().mutate()
152-
.header("SESSION", sessionId.toString())
153-
.build())
154-
.build();
155-
156-
WebSession actual = this.manager.getSession(this.exchange).block();
157-
assertNotNull(actual);
158-
assertEquals(existing.getId(), actual.getId());
107+
@Test(expected = IllegalArgumentException.class)
108+
public void setSessionIdWhenNullIdThenIllegalArgumentException() {
109+
String id = null;
110+
111+
this.idResolver.setSessionId(this.exchange, id);
159112
}
160113

161114
@Test
162-
public void alternateHeaderName() throws Exception {
163-
this.idResolver.setHeaderName("alternateHeaderName");
164-
165-
UUID sessionId = UUID.randomUUID();
166-
DefaultWebSession existing = createDefaultWebSession(sessionId);
167-
this.manager.getSessionStore().storeSession(existing);
168-
169-
this.exchange = this.exchange.mutate()
170-
.request(this.exchange.getRequest().mutate()
171-
.header("alternateHeaderName", sessionId.toString())
172-
.build())
173-
.build();
174-
175-
WebSession actual = this.manager.getSession(this.exchange).block();
176-
assertNotNull(actual);
177-
assertEquals(existing.getId(), actual.getId());
115+
public void resolveSessionIdsWhenNoIdsThenEmpty() {
116+
List<String> ids = this.idResolver.resolveSessionIds(this.exchange);
117+
118+
assertTrue(ids.isEmpty());
178119
}
179120

180-
private DefaultWebSession createDefaultWebSession(UUID sessionId) {
181-
return new DefaultWebSession(() -> sessionId, CLOCK, (s, session) -> Mono.empty(), s -> Mono.empty());
121+
@Test
122+
public void resolveSessionIdsWhenIdThenIdFound() {
123+
String id = "123";
124+
this.exchange = MockServerHttpRequest.get("/path")
125+
.header(HeaderWebSessionIdResolver.DEFAULT_HEADER_NAME, id)
126+
.toExchange();
127+
128+
List<String> ids = this.idResolver.resolveSessionIds(this.exchange);
129+
130+
assertEquals(Arrays.asList(id), ids);
182131
}
183132

133+
@Test
134+
public void resolveSessionIdsWhenMultipleIdsThenIdsFound() {
135+
String id1 = "123";
136+
String id2 = "abc";
137+
this.exchange = MockServerHttpRequest.get("/path")
138+
.header(HeaderWebSessionIdResolver.DEFAULT_HEADER_NAME, id1, id2)
139+
.toExchange();
140+
141+
List<String> ids = this.idResolver.resolveSessionIds(this.exchange);
142+
143+
assertEquals(Arrays.asList(id1, id2), ids);
144+
}
184145
}

0 commit comments

Comments
 (0)