diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md
index 7977fd820f..1431554882 100644
--- a/spring-5-reactive/README.md
+++ b/spring-5-reactive/README.md
@@ -14,3 +14,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring Webflux and CORS](http://www.baeldung.com/spring-webflux-cors)
- [Handling Errors in Spring WebFlux](http://www.baeldung.com/spring-webflux-errors)
- [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events)
+- [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/a-guide-to-spring-session-reactive-support-websession/)
\ No newline at end of file
diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml
index 5f455c3906..e903b57c4e 100644
--- a/spring-5-reactive/pom.xml
+++ b/spring-5-reactive/pom.xml
@@ -76,6 +76,28 @@
test
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.session
+ spring-session-core
+
+
+ org.springframework.session
+ spring-session-data-redis
+
+
org.apache.commons
commons-collections4
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/Application.java b/spring-5-reactive/src/main/java/com/baeldung/websession/Application.java
new file mode 100644
index 0000000000..667ef29658
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/Application.java
@@ -0,0 +1,15 @@
+package com.baeldung.websession;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan(basePackages = {"com.baeldung"})
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/RedisConfig.java b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/RedisConfig.java
new file mode 100644
index 0000000000..aa85cf9fd9
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/RedisConfig.java
@@ -0,0 +1,17 @@
+package com.baeldung.websession.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.session.data.redis.config.annotation.web.server.EnableRedisWebSession;
+
+@Configuration
+//@EnableRedisWebSession
+public class RedisConfig {
+/**
+ @Bean
+ public LettuceConnectionFactory redisConnectionFactory() {
+ return new LettuceConnectionFactory();
+ }
+*/
+}
\ No newline at end of file
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/SessionConfig.java b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/SessionConfig.java
new file mode 100644
index 0000000000..7cb2ff680e
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/SessionConfig.java
@@ -0,0 +1,20 @@
+package com.baeldung.websession.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.session.ReactiveMapSessionRepository;
+import org.springframework.session.ReactiveSessionRepository;
+import org.springframework.session.config.annotation.web.server.EnableSpringWebSession;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+@Configuration
+@EnableSpringWebSession
+public class SessionConfig {
+
+ @Bean
+ public ReactiveSessionRepository reactiveSessionRepository() {
+ return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java
new file mode 100644
index 0000000000..964b544916
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java
@@ -0,0 +1,20 @@
+package com.baeldung.websession.configuration;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.config.EnableWebFlux;
+import org.springframework.web.reactive.config.ResourceHandlerRegistry;
+import org.springframework.web.reactive.config.WebFluxConfigurer;
+
+@Configuration
+@EnableWebFlux
+public class WebFluxConfig implements ApplicationContextAware, WebFluxConfigurer {
+
+ private ApplicationContext context;
+
+ @Override
+ public void setApplicationContext(ApplicationContext context) {
+ this.context = context;
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java
new file mode 100644
index 0000000000..452bcac8ab
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java
@@ -0,0 +1,58 @@
+package com.baeldung.websession.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
+import org.springframework.security.config.web.server.ServerHttpSecurity;
+import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.server.SecurityWebFilterChain;
+import org.springframework.security.web.server.context.WebSessionServerSecurityContextRepository;
+
+@Configuration
+@EnableWebFluxSecurity
+public class WebFluxSecurityConfig {
+
+ @Bean
+ public MapReactiveUserDetailsService userDetailsService() {
+ UserDetails admin = User
+ .withUsername("admin")
+ .password(encoder().encode("password"))
+ .roles("ADMIN")
+ .build();
+
+ UserDetails user = User
+ .withUsername("user")
+ .password(encoder().encode("password"))
+ .roles("USER")
+ .build();
+
+ return new MapReactiveUserDetailsService(admin, user);
+ }
+
+ @Bean
+ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
+ http
+ .authorizeExchange()
+ .anyExchange().authenticated()
+ .and()
+ .httpBasic()
+ .securityContextRepository(new WebSessionServerSecurityContextRepository())
+ .and()
+ .formLogin();
+
+ http
+ .csrf().disable();
+
+ return http.build();
+
+ }
+
+ @Bean
+ public PasswordEncoder encoder() {
+ return new BCryptPasswordEncoder();
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/controller/SessionController.java b/spring-5-reactive/src/main/java/com/baeldung/websession/controller/SessionController.java
new file mode 100644
index 0000000000..b91a050322
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/controller/SessionController.java
@@ -0,0 +1,42 @@
+package com.baeldung.websession.controller;
+
+import com.baeldung.websession.transfer.CustomResponse;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.server.WebSession;
+import reactor.core.publisher.Mono;
+
+@RestController
+public class SessionController {
+
+ @GetMapping("/websession/test")
+ public Mono testWebSessionByParam(
+ @RequestParam(value = "id") int id,
+ @RequestParam(value = "note") String note,
+ WebSession session) {
+
+ session.getAttributes().put("id", id);
+ session.getAttributes().put("note", note);
+
+ CustomResponse r = new CustomResponse();
+ r.setId((int) session.getAttributes().get("id"));
+ r.setNote((String) session.getAttributes().get("note"));
+
+ return Mono.just(r);
+ }
+
+ @GetMapping("/websession")
+ public Mono getSession(WebSession session) {
+
+ session.getAttributes().putIfAbsent("id", 0);
+ session.getAttributes().putIfAbsent("note", "Howdy Cosmic Spheroid!");
+
+ CustomResponse r = new CustomResponse();
+ r.setId((int) session.getAttributes().get("id"));
+ r.setNote((String) session.getAttributes().get("note"));
+
+ return Mono.just(r);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/transfer/CustomResponse.java b/spring-5-reactive/src/main/java/com/baeldung/websession/transfer/CustomResponse.java
new file mode 100644
index 0000000000..2d562de157
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/transfer/CustomResponse.java
@@ -0,0 +1,31 @@
+package com.baeldung.websession.transfer;
+
+public class CustomResponse {
+
+ private int id;
+ private String note;
+
+ public CustomResponse() {}
+
+ public CustomResponse(int id, String note) {
+ this.id = id;
+ this.note = note;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getNote() {
+ return note;
+ }
+
+ public void setNote(String note) {
+ this.note = note;
+ }
+
+}