Add support for omitting SameSite attribute from session cookie
See gh-44714 Signed-off-by: Filip Hrisafov <filip.hrisafov@gmail.com>
This commit is contained in:
committed by
Andy Wilkinson
parent
9920b5f252
commit
ccbc4f91ec
@@ -284,7 +284,7 @@ public class JettyServletWebServerFactory extends AbstractServletWebServerFactor
|
||||
private void configureSession(WebAppContext context) {
|
||||
SessionHandler handler = context.getSessionHandler();
|
||||
SameSite sessionSameSite = getSession().getCookie().getSameSite();
|
||||
if (sessionSameSite != null) {
|
||||
if (sessionSameSite != null && sessionSameSite != SameSite.OMITTED) {
|
||||
handler.setSameSite(HttpCookie.SameSite.valueOf(sessionSameSite.name()));
|
||||
}
|
||||
Duration sessionTimeout = getSession().getTimeout();
|
||||
|
||||
@@ -998,11 +998,12 @@ public class TomcatServletWebServerFactory extends AbstractServletWebServerFacto
|
||||
@Override
|
||||
public String generateHeader(Cookie cookie, HttpServletRequest request) {
|
||||
SameSite sameSite = getSameSite(cookie);
|
||||
if (sameSite == null) {
|
||||
String sameSiteValue = (sameSite != null) ? sameSite.attributeValue() : null;
|
||||
if (sameSiteValue == null) {
|
||||
return super.generateHeader(cookie, request);
|
||||
}
|
||||
Rfc6265CookieProcessor delegate = new Rfc6265CookieProcessor();
|
||||
delegate.setSameSiteCookies(sameSite.attributeValue());
|
||||
delegate.setSameSiteCookies(sameSiteValue);
|
||||
return delegate.generateHeader(cookie, request);
|
||||
}
|
||||
|
||||
|
||||
@@ -635,7 +635,10 @@ public class UndertowServletWebServerFactory extends AbstractServletWebServerFac
|
||||
private void beforeCommit(HttpServerExchange exchange) {
|
||||
for (Cookie cookie : exchange.responseCookies()) {
|
||||
SameSite sameSite = getSameSite(asServletCookie(cookie));
|
||||
if (sameSite != null) {
|
||||
if (sameSite == SameSite.OMITTED) {
|
||||
cookie.setSameSite(false);
|
||||
}
|
||||
else if (sameSite != null) {
|
||||
cookie.setSameSiteMode(sameSite.attributeValue());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,6 +145,11 @@ public class Cookie {
|
||||
*/
|
||||
public enum SameSite {
|
||||
|
||||
/**
|
||||
* The SameSite cookie attribute will be omitted when creating the cookie.
|
||||
*/
|
||||
OMITTED(null),
|
||||
|
||||
/**
|
||||
* Cookies are sent in both first-party and cross-origin requests.
|
||||
*/
|
||||
|
||||
@@ -881,7 +881,7 @@ public abstract class AbstractServletWebServerFactoryTests {
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@EnumSource
|
||||
@EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "OMITTED")
|
||||
void sessionCookieSameSiteAttributeCanBeConfiguredAndOnlyAffectsSessionCookies(SameSite sameSite) throws Exception {
|
||||
AbstractServletWebServerFactory factory = getFactory();
|
||||
factory.getSession().getCookie().setSameSite(sameSite);
|
||||
@@ -896,7 +896,7 @@ public abstract class AbstractServletWebServerFactoryTests {
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@EnumSource
|
||||
@EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "OMITTED")
|
||||
void sessionCookieSameSiteAttributeCanBeConfiguredAndOnlyAffectsSessionCookiesWhenUsingCustomName(SameSite sameSite)
|
||||
throws Exception {
|
||||
AbstractServletWebServerFactory factory = getFactory();
|
||||
@@ -949,6 +949,23 @@ public abstract class AbstractServletWebServerFactoryTests {
|
||||
(header) -> assertThat(header).contains("test=test").contains("SameSite=Strict"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void cookieSameSiteSuppliersShouldNotAffectOmittedSameSite() throws IOException, URISyntaxException {
|
||||
AbstractServletWebServerFactory factory = getFactory();
|
||||
factory.getSession().getCookie().setSameSite(SameSite.OMITTED);
|
||||
factory.getSession().getCookie().setName("SESSIONCOOKIE");
|
||||
factory.addCookieSameSiteSuppliers(CookieSameSiteSupplier.ofStrict());
|
||||
factory.addInitializers(new ServletRegistrationBean<>(new CookieServlet(false), "/"));
|
||||
this.webServer = factory.getWebServer();
|
||||
this.webServer.start();
|
||||
ClientHttpResponse clientResponse = getClientResponse(getLocalUrl("/"));
|
||||
assertThat(clientResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
List<String> setCookieHeaders = clientResponse.getHeaders().get("Set-Cookie");
|
||||
assertThat(setCookieHeaders).satisfiesExactlyInAnyOrder(
|
||||
(header) -> assertThat(header).contains("SESSIONCOOKIE").doesNotContain("SameSite"),
|
||||
(header) -> assertThat(header).contains("test=test").contains("SameSite=Strict"));
|
||||
}
|
||||
|
||||
@Test
|
||||
protected void sslSessionTracking() {
|
||||
AbstractServletWebServerFactory factory = getFactory();
|
||||
|
||||
Reference in New Issue
Block a user