1. Přehled
V tomto rychlém tutoriálu prozkoumáme, jak používat Spring Session podporovanou MongoDB, a to jak s Spring Boot, tak bez něj.
Spring Session lze také podpořit dalšími obchody, jako je Redis a JDBC.
2. Spring Boot Configuration
Nejprve se podívejme na závislosti a konfiguraci vyžadovanou pro Spring Boot. Pro začátek přidejte nejnovější verze spring-session-data-mongodb a spring-boot-starter-data-mongodb k našemu projektu:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-mongodb</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
Poté, abychom povolili automatickou konfiguraci Spring Boot, budeme muset přidat typ úložiště Spring Session jako mongodb v application.properties :
spring.session.store-type=mongodb
3. Konfigurace pružiny bez pružinové boty
Nyní se podívejme na závislosti a konfiguraci potřebnou k uložení jarní relace v MongoDB bez Spring Boot.
Podobně jako u konfigurace Spring Boot budeme potřebovat spring-session-data-mongodb závislost. Zde však použijeme spring-data-mongodb závislost pro přístup k naší databázi MongoDB:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-mongodb</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
Nakonec se podívejme, jak aplikaci nakonfigurovat:
@EnableMongoHttpSession
public class HttpSessionConfig {
@Bean
public JdkMongoSessionConverter jdkMongoSessionConverter() {
return new JdkMongoSessionConverter(Duration.ofMinutes(30));
}
}
@EnableMongoHttpSession anotace umožňuje konfiguraci potřebnou k ukládání dat relace do MongoDB .
Všimněte si také, že JdkMongoSessionConverter je zodpovědný za serializaci a deserializaci dat relace.
4. Příklad aplikace
Pojďme vytvořit aplikaci pro testování konfigurací. Budeme používat Spring Boot, protože je rychlejší a vyžaduje méně konfigurace.
Začneme vytvořením ovladače pro zpracování požadavků:
@RestController
public class SpringSessionMongoDBController {
@GetMapping("/")
public ResponseEntity<Integer> count(HttpSession session) {
Integer counter = (Integer) session.getAttribute("count");
if (counter == null) {
counter = 1;
} else {
counter++;
}
session.setAttribute("count", counter);
return ResponseEntity.ok(counter);
}
}
Jak vidíme v tomto příkladu, zvyšujeme počítadlo při každém zásahu do koncového bodu a uložení jeho hodnoty do atributu relace s názvem count .
5. Testování Aplikace
Pojďme otestovat aplikaci, abychom zjistili, zda jsme skutečně schopni ukládat data relace do MongoDB.
Za tímto účelem přistoupíme ke koncovému bodu a zkontrolujeme soubor cookie, který obdržíme. Toto bude obsahovat ID relace.
Poté požádáme kolekci MongoDB, abychom načetli data relace pomocí ID relace:
@Test
public void
givenEndpointIsCalledTwiceAndResponseIsReturned_whenMongoDBIsQueriedForCount_thenCountMustBeSame() {
HttpEntity<String> response = restTemplate
.exchange("http://localhost:" + 8080, HttpMethod.GET, null, String.class);
HttpHeaders headers = response.getHeaders();
String set_cookie = headers.getFirst(HttpHeaders.SET_COOKIE);
Assert.assertEquals(response.getBody(),
repository.findById(getSessionId(set_cookie)).getAttribute("count").toString());
}
private String getSessionId(String cookie) {
return new String(Base64.getDecoder().decode(cookie.split(";")[0].split("=")[1]));
}
6. Jak to funguje?
Pojďme se podívat na to, co se děje v zákulisí jarního zasedání.
SessionRepositoryFilter je zodpovědný za většinu práce:
- převede HttpSession do MongoSession
- zkontroluje, zda existuje cookie přítomný, a pokud ano, načte data relace z úložiště
- uloží aktualizovaná data relace do obchodu
- kontroluje platnost relace
Také SessionRepositoryFilter vytvoří soubor cookie s názvem SESSION to je HttpOnly a bezpečné. Tento soubor cookie obsahuje ID relace, což je hodnota zakódovaná v Base64.
Chcete-li upravit název nebo vlastnosti souboru cookie, budeme muset vytvořit Spring bean typu DefaultCookieSerializer.
Zde například deaktivujeme pouze http vlastnost souboru cookie:
@Bean
public DefaultCookieSerializer customCookieSerializer(){
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
cookieSerializer.setUseHttpOnlyCookie(false);
return cookieSerializer;
}
7. Podrobnosti relace uložené v MongoDB
Pojďme se zeptat na naši kolekci relací pomocí následujícího příkazu v naší konzoli MongoDB:
db.sessions.findOne()
V důsledku toho získáme dokument BSON podobný:
{
"_id" : "5d985be4-217c-472c-ae02-d6fca454662b",
"created" : ISODate("2019-05-14T16:45:41.021Z"),
"accessed" : ISODate("2019-05-14T17:18:59.118Z"),
"interval" : "PT30M",
"principal" : null,
"expireAt" : ISODate("2019-05-14T17:48:59.118Z"),
"attr" : BinData(0,"rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABdAAFY291bnRzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAC3g=")
}
_id je UUID, které bude pomocí DefaultCookieSerializer zakódováno pomocí Base64 a nastavte jako hodnotu v SESSION cookie. Všimněte si také, že attr atribut obsahuje skutečnou hodnotu našeho počítadla.