Перейти к основному содержимому

Руководство по реактивной поддержке Spring Session: WebSession

· 3 мин. чтения

1. Введение

В этой статье мы узнаем, как объединить Spring Session с Spring WebFlux. В частности, мы узнаем, как использовать Spring WebSession, который объединяет Spring Session с WebFlux Spring Boot 2.

Spring Session определяется как «упрощенная карта пар имя-значение». Сеансы отслеживают значения, которые важны для сеанса HTTP, такие как Users и Principals. Таким образом, мы можем использовать Session management вместе с новыми реактивными объектами WebFlux Mono и Flux . Spring Session также поддерживает использование различных контейнеров приложений (а не только Tomcat).

Чтобы узнать больше о Spring Session, ознакомьтесь с другой отличной статьей здесь, на ForEach .

2. Настройка Мавена

Теперь давайте настроим и настроим наше приложение. К счастью, настроить наш pom.xml довольно легко. Во-первых, нам нужно использовать Spring Boot 2.xx вместе с соответствующими зависимостями Spring Session. Добавьте новейшую версию через репозиторий Maven:

Затем мы добавляем их в pom.xml :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
<version>2.5.1</version>
</dependency>

Эти три зависимости являются минимальными требованиями для управления сеансами в памяти. Для Redis используйте:

Затем добавьте в pom.xml следующее :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.5.1</version>
</dependency>

Теперь давайте настроим наши классы.

3. Конфигурация в памяти

Чтобы использовать конфигурацию в памяти, добавьте класс конфигурации:

@Configuration
@EnableSpringWebSession
public class SessionConfig {

@Bean
public ReactiveSessionRepository reactiveSessionRepository() {
return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
}
}

Это связывает (реактивный) репозиторий с вашим менеджером сеансов. Он сохранит эти значения в HashMap .

Важно отметить, что класс конфигурации должен включать аннотацию @EnableSpringWebSession .

4. Конфигурация Redis

Теперь давайте подключим Redis. Чтобы использовать Redis для управления WebSessions, добавьте класс конфигурации:

@Configuration
@EnableRedisWebSession
public class RedisConfig {

@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory();
}
}

Обратите внимание, что класс конфигурации должен включать аннотацию @EnableRedisWebSession . Помните, что мы не можем использовать аннотации @EnableRedisWebSession и EnableSpringWebSession вместе, не вызывая исключения.

Docker — один из самых простых способов взаимодействия с Redis. После установки Docker нам нужно ввести всего три команды. Запустите команду, чтобы запустить экземпляр Redis:

$ docker stop redis
$ docker rm redis
$ docker run -d --name redis -p 6379:6379 redis:4.0.5-alpine

Далее давайте протестируем наше приложение.

5. На практике

Теперь добавим в наше приложение реактивный REST-контроллер:

@GetMapping("/websession")
public Mono<String> getSession(WebSession session) {
session.getAttributes().putIfAbsent("note", "Howdy Cosmic Spheroid!");
return Mono.just((String) session.getAttributes().get("note"));
}

Затем мы можем использовать WebSession , добавив параметр в наши обработчики REST. Мы можем получить или установить значения, используя метод .getAttributes() , который возвращает карту.

Давайте раскрутим наше приложение Spring:

./7aaac8e257562cc3261af6c53a5628a0.png

Теперь наше приложение можно просмотреть на локальном хосте: 8080 , и оно представит страницу входа в Spring. Попробуйте учетные данные для входа по умолчанию ( -u admin -p пароль ):

./c2c7accb9fa60546bc2751b6a0fa33ab.png

После аутентификации мы можем изменить значения WebSession по умолчанию ( 0 и «Привет, космический сфероид!» ). Запустите команду curl :

$ curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X GET http://localhost:8080/websession/test?id=222&note=helloworld

или посетите URL-адрес http://localhost:8080/websession/test?id=222¬e=helloworld . После этого JSON, возвращаемый с localhost:8080/websession , будет отображать обновленные значения сеанса :

./70226b2969aa6f78ab90171776ca3687.png

Эта конечная точка, localhost:8080/websession, возвращает текущий идентификатор атрибутов WebSession и примечание.

6. Заключение

Мы узнали, как добавить Spring WebSession в наши приложения WebFlux. Для получения дополнительной информации ознакомьтесь с отличной официальной документацией.

Как всегда, образцы кода, использованные в этой статье , доступны на GitHub.