java
47 lines · 7 steps
Backing HTTP sessions with Redis in Spring
A Spring config class that stores servlet sessions in Redis, tuning the connection, serialization, and cookie behavior.
Explained by
highlit
1@Configuration
2@EnableRedisHttpSession(namespace = "myapp:sessions", maxInactiveIntervalInSeconds = 1800, flushMode = FlushMode.IMMEDIATE)
3public class SessionConfig {
4
5 @Bean
6 public LettuceConnectionFactory redisConnectionFactory(
7 @Value("${spring.redis.host}") String host,
8 @Value("${spring.redis.port}") int port,
9 @Value("${spring.redis.password:}") String password) {
10
11 RedisStandaloneConfiguration standalone = new RedisStandaloneConfiguration(host, port);
12 if (!password.isBlank()) {
13 standalone.setPassword(RedisPassword.of(password));
14 }
15
16 LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
17 .commandTimeout(Duration.ofSeconds(2))
18 .clientOptions(ClientOptions.builder()
19 .autoReconnect(true)
20 .disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
21 .build())
22 .build();
23
24 return new LettuceConnectionFactory(standalone, clientConfig);
25 }
26
27 @Bean
28 public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
29 return new GenericJackson2JsonRedisSerializer();
30 }
31
32 @Bean
33 public CookieSerializer cookieSerializer() {
34 DefaultCookieSerializer serializer = new DefaultCookieSerializer();
35 serializer.setCookieName("MYAPPSESSION");
36 serializer.setCookiePath("/");
37 serializer.setUseHttpOnlyCookie(true);
38 serializer.setSameSite("Lax");
39 serializer.setUseSecureCookie(true);
40 return serializer;
41 }
42
43 @Bean
44 public ConfigureRedisAction configureRedisAction() {
45 return ConfigureRedisAction.NO_OP;
46 }
47}
01 / 01
STEP 01
‹ swipe to step through ›
Walkthrough
Space play
←→ step
click any line
Three takeaways
- 1Externalizing HTTP sessions to Redis lets multiple app instances share login state without sticky sessions.
- 2Explicit serializer and cookie beans give you control over on-disk format and browser security attributes.
- 3Connection options like command timeouts and disconnected behavior decide how the app fails when Redis is unreachable.
Related explainers
typescript
import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import * as Joi from 'joi';
Validating env config at boot in NestJS
configuration
schema-validation
environment-variables
Intermediate
8 steps
java
@Component @Converter public class EncryptedStringConverter implements AttributeConverter<String, String> {
Transparent column encryption in Spring & JPA
encryption
aes-gcm
jpa-converter
Advanced
10 steps
java
package com.acme.billing.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties;
Feature-flagged beans with Spring @ConditionalOnProperty
feature-flags
conditional-beans
strategy-pattern
Intermediate
5 steps
java
public static Map<String, String> parseCookieHeader(String header) { Map<String, String> cookies = new LinkedHashMap<>(); if (header == null || header.isBlank()) { return cookies;
Parsing an HTTP Cookie header in Java
string-parsing
http
url-decoding
Intermediate
6 steps
ruby
class ApplicationController < ActionController::Base EXPERIMENTS = { checkout_button_color: %w[control blue green], onboarding_flow: %w[control streamlined]
How A/B test cohorts are assigned in Rails
a-b-testing
cookies
hashing
Intermediate
8 steps
java
public class TimedSocketReader { private static final int READ_TIMEOUT_MS = 5_000; private static final int CONNECT_TIMEOUT_MS = 3_000;
Reading a socket with connect and read timeouts
sockets
timeouts
io
Intermediate
8 steps
Share this explainer
Here's the card — post it anywhere.
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code
Embed this explainer
Drop the interactive walkthrough into a blog or docs. Views never cost a credit.
<iframe src="https://highlit.co/explainers/backing-http-sessions-with-redis-in-spring-explained-java-da2a/embed?autoplay=1" width="100%" height="520" loading="lazy" style="border:0"></iframe>
Autoplay is on by default — add ?autoplay=0 to start paused.