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

Walkthrough

Space play step click any line
Three takeaways
  1. 1Externalizing HTTP sessions to Redis lets multiple app instances share login state without sticky sessions.
  2. 2Explicit serializer and cookie beans give you control over on-disk format and browser security attributes.
  3. 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.

Backing HTTP sessions with Redis in Spring — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code