From 65ec66eeb5efaee5b825ac6ff3a9df7b579acaa7 Mon Sep 17 00:00:00 2001 From: Marcus Da Coregio Date: Mon, 1 Aug 2022 11:16:13 -0300 Subject: [PATCH] Add session-jdbc sample Closes gh-27 --- session-jdbc/README.md | 1 + session-jdbc/build.gradle | 21 ++++++++++++++ .../jdbc/SessionJdbcApplicationTests.java | 24 ++++++++++++++++ .../session/jdbc/CounterController.java | 28 +++++++++++++++++++ .../example/session/jdbc/SessionConfig.java | 20 +++++++++++++ .../session/jdbc/SessionJdbcApplication.java | 13 +++++++++ .../jdbc/SessionJdbcApplicationTests.java | 15 ++++++++++ settings.gradle | 1 + 8 files changed, 123 insertions(+) create mode 100644 session-jdbc/README.md create mode 100644 session-jdbc/build.gradle create mode 100644 session-jdbc/src/aotTest/java/com/example/session/jdbc/SessionJdbcApplicationTests.java create mode 100644 session-jdbc/src/main/java/com/example/session/jdbc/CounterController.java create mode 100644 session-jdbc/src/main/java/com/example/session/jdbc/SessionConfig.java create mode 100644 session-jdbc/src/main/java/com/example/session/jdbc/SessionJdbcApplication.java create mode 100644 session-jdbc/src/test/java/com/example/session/jdbc/SessionJdbcApplicationTests.java diff --git a/session-jdbc/README.md b/session-jdbc/README.md new file mode 100644 index 00000000..1281ee1b --- /dev/null +++ b/session-jdbc/README.md @@ -0,0 +1 @@ +Tests the session persistence and cookie customization from Spring Session together with Spring Session JDBC and Spring Web. diff --git a/session-jdbc/build.gradle b/session-jdbc/build.gradle new file mode 100644 index 00000000..7fb1d096 --- /dev/null +++ b/session-jdbc/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'org.springframework.aot.smoke-test' + id 'org.graalvm.buildtools.native' +} + +dependencies { + implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)) + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("com.h2database:h2") + implementation("org.springframework.session:spring-session-jdbc:3.0.0-SNAPSHOT") + + testImplementation("org.springframework.boot:spring-boot-starter-test") + + aotTestImplementation(project(":aot-smoke-test-support")) +} + +aotSmokeTest { + webApplication = true +} diff --git a/session-jdbc/src/aotTest/java/com/example/session/jdbc/SessionJdbcApplicationTests.java b/session-jdbc/src/aotTest/java/com/example/session/jdbc/SessionJdbcApplicationTests.java new file mode 100644 index 00000000..90e15949 --- /dev/null +++ b/session-jdbc/src/aotTest/java/com/example/session/jdbc/SessionJdbcApplicationTests.java @@ -0,0 +1,24 @@ +package com.example.session.jdbc; + +import java.util.concurrent.atomic.AtomicReference; + +import org.junit.jupiter.api.Test; + +import org.springframework.aot.smoketest.support.junit.AotSmokeTest; +import org.springframework.test.web.reactive.server.WebTestClient; + +@AotSmokeTest +public class SessionJdbcApplicationTests { + + @Test + void shouldIncreaseCounter(WebTestClient client) { + AtomicReference sessionId = new AtomicReference<>(); + client.get().uri("/counter").exchange().expectCookie().value("SESSIONCOOKIE", sessionId::set).expectBody() + .jsonPath("$.counter").isEqualTo(1); + client.get().uri("/counter").cookie("SESSIONCOOKIE", sessionId.get()).exchange().expectBody() + .jsonPath("$.counter").isEqualTo(2); + client.get().uri("/counter").cookie("SESSIONCOOKIE", sessionId.get()).exchange().expectBody() + .jsonPath("$.counter").isEqualTo(3); + } + +} diff --git a/session-jdbc/src/main/java/com/example/session/jdbc/CounterController.java b/session-jdbc/src/main/java/com/example/session/jdbc/CounterController.java new file mode 100644 index 00000000..a89708b1 --- /dev/null +++ b/session-jdbc/src/main/java/com/example/session/jdbc/CounterController.java @@ -0,0 +1,28 @@ +package com.example.session.jdbc; + +import java.util.Map; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(value = "/counter", produces = MediaType.APPLICATION_JSON_VALUE) +public class CounterController { + + @GetMapping + public Map counter(HttpServletRequest request) { + HttpSession session = request.getSession(); + if (session.getAttribute("counter") == null) { + session.setAttribute("counter", 1); + } + int counter = (int) session.getAttribute("counter"); + session.setAttribute("counter", counter + 1); + return Map.of("counter", counter); + } + +} diff --git a/session-jdbc/src/main/java/com/example/session/jdbc/SessionConfig.java b/session-jdbc/src/main/java/com/example/session/jdbc/SessionConfig.java new file mode 100644 index 00000000..d63aa756 --- /dev/null +++ b/session-jdbc/src/main/java/com/example/session/jdbc/SessionConfig.java @@ -0,0 +1,20 @@ +package com.example.session.jdbc; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.session.web.http.CookieSerializer; +import org.springframework.session.web.http.DefaultCookieSerializer; + +@Configuration +public class SessionConfig { + + @Bean + public CookieSerializer cookieSerializer() { + DefaultCookieSerializer serializer = new DefaultCookieSerializer(); + serializer.setCookieName("SESSIONCOOKIE"); + serializer.setCookiePath("/"); + serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$"); + return serializer; + } + +} diff --git a/session-jdbc/src/main/java/com/example/session/jdbc/SessionJdbcApplication.java b/session-jdbc/src/main/java/com/example/session/jdbc/SessionJdbcApplication.java new file mode 100644 index 00000000..79d5052e --- /dev/null +++ b/session-jdbc/src/main/java/com/example/session/jdbc/SessionJdbcApplication.java @@ -0,0 +1,13 @@ +package com.example.session.jdbc; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SessionJdbcApplication { + + public static void main(String[] args) { + SpringApplication.run(SessionJdbcApplication.class, args); + } + +} diff --git a/session-jdbc/src/test/java/com/example/session/jdbc/SessionJdbcApplicationTests.java b/session-jdbc/src/test/java/com/example/session/jdbc/SessionJdbcApplicationTests.java new file mode 100644 index 00000000..44c9be88 --- /dev/null +++ b/session-jdbc/src/test/java/com/example/session/jdbc/SessionJdbcApplicationTests.java @@ -0,0 +1,15 @@ +package com.example.session.jdbc; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class SessionJdbcApplicationTests { + + @Test + void contextLoads() { + + } + +} diff --git a/settings.gradle b/settings.gradle index 3c411e48..228fab17 100644 --- a/settings.gradle +++ b/settings.gradle @@ -60,6 +60,7 @@ include "security-method" include "security-thymeleaf" include "security-webflux" include "security-webmvc" +include "session-jdbc" include "session-redis-webflux" include "spring-amqp-rabbit" include "spring-kafka"