Spring-session — это очень крутой новый проект, цель которого — предоставить более простой способ управления сеансами в веб-приложениях на основе Java. Одной из особенностей, которые я недавно исследовал в Spring-session, было то, что он поддерживает экстернализацию состояния сеанса без необходимости работать с внутренними компонентами определенных веб-контейнеров, таких как Tomcat или Jetty.
Чтобы протестировать весеннюю сессию, я использовал приложение типа корзины для покупок (доступно здесь ), которое интенсивно использует сессию, сохраняя элементы, добавленные в корзину, в качестве атрибута сессии, как видно из этих снимков экрана:
Рассмотрим сначала сценарий без весенней сессии. Вот как я выставил свое приложение:
Я использую nginx для балансировки нагрузки между двумя экземплярами этого приложения. Эту настройку очень легко запустить с помощью Spring-загрузки, я запустил два экземпляра приложения, используя два разных серверных порта:
| 
 1 
2 
 | 
mvn spring-boot:run -Dserver.port=8080mvn spring-boot:run -Dserver.port=8082 | 
и это мой nginx.conf для балансировки нагрузки между этими двумя экземплярами:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
 | 
events {    worker_connections  1024;}http {    upstream sessionApp {        server localhost:8080;        server localhost:8082;    }    server {        listen 80;        location / {            proxy_pass http://sessionApp;        }           }} | 
Я отображаю номер порта приложения в нижнем колонтитуле, чтобы показать, какой экземпляр обрабатывает запрос.
Если бы я ничего не делал для перемещения состояния сеанса из приложения, то поведение приложения было бы неустойчивым, поскольку сеанс, установленный в одном экземпляре приложения, не был бы распознан другим экземпляром, особенно если Tomcat получает сеанс Если он не распознает, то поведение заключается в создании нового сеанса.
Введение весенней сессии в приложение
Существуют специфические для контейнера способы представления внешних хранилищ сеансов. Один из примеров здесь , где Redis настроен как хранилище для Tomcat. Pivotal Gemfire предоставляет модуль для экстернализации состояния сеанса Tomcat .
Преимущество использования Spring-сеанса в том, что он вообще не зависит от контейнера — поддержание состояния сеанса становится проблемой приложения. Инструкции по настройке приложения для использования сеанса Spring подробно изложены на сайте сеанса Spring , просто для краткого изложения того, как я сконфигурировал свое приложение Spring Boot, это в первую очередь зависимости, которые я извлек:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
 | 
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.0.0.BUILD-SNAPSHOT</version></dependency><dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.0.0.BUILD-SNAPSHOT</version></dependency><dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.4.1.RELEASE</version></dependency><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.4.1</version></dependency> | 
и моя конфигурация для использования Spring-сессии для поддержки сеанса, обратите внимание на специфичный для Spring Boot FilterRegistrationBean, который используется для регистрации фильтра репозитория сеанса :
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
 | 
mport org.springframework.boot.context.embedded.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.annotation.Order;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;import org.springframework.session.web.http.SessionRepositoryFilter;import org.springframework.web.filter.DelegatingFilterProxy;import java.util.Arrays;@Configuration@EnableRedisHttpSessionpublic class SessionRepositoryConfig { @Bean @Order(value = 0) public FilterRegistrationBean sessionRepositoryFilterRegistration(SessionRepositoryFilter springSessionRepositoryFilter) {  FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();  filterRegistrationBean.setFilter(new DelegatingFilterProxy(springSessionRepositoryFilter));  filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));  return filterRegistrationBean; } @Bean public JedisConnectionFactory connectionFactory() {  return new JedisConnectionFactory(); }} | 
И это все! волшебным образом теперь вся сессия обрабатывается Spring-сессией и аккуратно выводится на Redis.
Если бы мне пришлось повторить мою предыдущую конфигурацию использования nginx для балансировки нагрузки двух разных приложений Spring-Boot с использованием общего хранилища Redis, приложение просто работает независимо от экземпляра, обрабатывающего запрос. Я с нетерпением жду дальнейших улучшений этого превосходного нового проекта.
- Пример приложения, использующего Spring-сессию, доступен здесь : https://github.com/bijukunjummen/shopping-cart-cf-app.git.
 
| Ссылка: | Вывод состояния сеанса для приложения Spring-boot с использованием Spring-сеанса от нашего партнера по JCG Биджу Кунджуммена из блога all and sundry. | 


