Spring Boot HTTP Sessions with Embedded Infinispan

What You Will Learn

How to store Spring Boot HTTP sessions in an embedded Infinispan cache using @EnableInfinispanEmbeddedHttpSession, with distributed clustering for session replication across nodes.

Prerequisites

  • Java 17+

  • Spring Boot

Step 1: Add Dependencies

Add the Infinispan Spring Boot embedded starter, Spring Web, and Spring Session:

<dependency>
   <groupId>org.infinispan</groupId>
   <artifactId>infinispan-spring-boot4-starter-embedded</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.session</groupId>
   <artifactId>spring-session-core</artifactId>
</dependency>

Step 2: Enable Embedded HTTP Sessions with Clustering

Annotate your application with @EnableInfinispanEmbeddedHttpSession and configure a clustered cache for sessions:

@EnableInfinispanEmbeddedHttpSession
@SpringBootApplication
public class UserSessionsApp {

    @Bean
    public InfinispanGlobalConfigurer globalCustomizer() {
        return () -> GlobalConfigurationBuilder
              .defaultClusteredBuilder()
              .metrics().gauges(false).histograms(false)
              .globalState().disable()
              .build();
    }

    @Bean
    public InfinispanCacheConfigurer cacheConfigurer() {
        return manager -> {
            final Configuration ispnConfig = new ConfigurationBuilder()
                    .clustering()
                    .cacheMode(CacheMode.DIST_SYNC)
                    .statistics().disable()
                    .build();


            manager.defineConfiguration("sessions", ispnConfig);
        };
    }

    public static void main(String... args) {
        new SpringApplicationBuilder().sources(UserSessionsApp.class).run(args);
    }
}

Step 3: Use Sessions in a REST Controller

Store and retrieve session data through a REST controller:

@RestController
public class UserSessionsController {

    public static final String LATEST_SESSION_VALUE = "latest";

    @Autowired
    private SpringEmbeddedCacheManager cacheManager;

    @GetMapping("/")
    public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name,
                           HttpSession session) {
        String latest = (String) session.getAttribute(LATEST_SESSION_VALUE);
        session.setAttribute("latest", name);
        if(latest == null) {
            return "Nobody to ciao";
        }
        return "ciao " + latest;
    }

    @GetMapping("/sessions")
    public Set<?> sessions() {
        return cacheManager.getCache("sessions").getNativeCache().keySet();
    }

Step 4: Run the Tutorial

mvn spring-boot:run

Visit http://localhost:8080/?name=Katia. Refresh to see the previous name from the session. Start multiple instances on different ports to see distributed session replication.

What’s Next