# Sessions
Mit Spring Session (opens new window) ist es möglich den Store für die Sessions selbst zu konfigurieren. Dieser kann auch remote liegen, also z. B. über JDBC oder Redis angesprochen werden. Dafür gibt es noch weitere Module wie Spring Session JDBC und Spring Session Data Redis.
# Dependencies
Beim Spring Initializr muss Spring Session gewählt werden. Alternativ muss folgende Dependency im Buildscript hinzugefügt werden:
implementation("org.springframework.session:spring-session-core")
# Store
Um Spring Session zu aktivieren muss @EnableSpringWebSession benutzt werden. Außerdem ist ein Bean vom Typ ReactiveSessionRepository nötig, welches den Session-Store liefert.
@Configuration
@EnableSpringWebSession
class SessionConfig {
@Bean
fun sessionRepo() = ReactiveMapSessionRepository(ConcurrentHashMap()).apply {
// default 30 min
setDefaultMaxInactiveInterval(Duration.ofHours(4).toSeconds().toInt())
}
}
ReactiveMapSessionRepository ist ein In-Memory-Store, dem man eine Map (Key = Session-ID String, Value = Session) als Storage übergibt. Um Sachen wie maximale Anzahl Sessions muss man sich selbst kümmern.
WARNING
Da ggf. mehrere Threads gleichzeitig auf den Store zugreifen, muss auf Threadsicherheit geachtet werden - deshalb wurde im Beispiel eine ConcurrentHashMap benutzt.
In den Docs finden sich Informationen, wie Redis (opens new window) oder JDBC (opens new window) anzubinden sind. Alternativ kann man auch ReactiveMapSessionRepository mit einer distributed Map Implementation benutzen.
# Client
Standardmäßig wird dem Client die Session-ID in einem Cookie namens SESSION mitgeteilt, welches er dann immer wieder mitschicken muss, um in die Session einzusteigen und sie am Leben zu halten.
Diese Art und Weise kann mit einem Bean vom Typ WebSessionIdResolver angepasst werden.
@Bean
fun sessionIdResolver(): WebSessionIdResolver = CookieWebSessionIdResolver().apply {
cookieName = "Session-Id" // default "SESSION"
}
Es kann auch von Cookie auf Header umgestellt werden:
@Bean
fun sessionIdResolver(): WebSessionIdResolver = HeaderWebSessionIdResolver().apply {
headerName = "Session-Id" // default "SESSION"
}
Hierbei muss der Client im Request dann denselben Header wieder mitschicken.
Die Session-ID an sich ist standardmäßig eine zufällige UUID (UUID.randomUUID()).
# Benutzen
Zugriff auf die Session erhält man in Controller-Methoden, indem man ein Parameter vom Typ org.springframework.web.server.WebSession erwartet.
@GetMapping("...")
fun getSomething(session: WebSession) = // ...
TIP
Falls OpenAPI benutzt wird, sollte dieser Parameter mit @Parameter(hidden = true) markiert werden, damit er nicht in der API-Doku auftaucht.
WebSession enthält verschiedene Methoden, um mit der Session zu arbeiten, so beispielsweise:
getId()getAttribute(name),getRequiredAttribute(name),getAttributeOrDefault(name, defaultValue)getCreationTime(),getLastAccessTime()getMaxIdleTime(),setMaxIdleTime()
Zugriff auf die Attribute-Map erhält man mit getAttributes(), hiermit können dann auch Attribute geschrieben werden:
session.attributes["myKey"] = // ...
← WebSockets Security →