springSession
даspring
проект в рамкахservlet
контейнер реализованhttpSession
заменитьspringSession
, сосредоточиться на решенииsession
вопросы управления. Простая, быстрая и бесшовная интеграция в наши приложения. В этой статье используется случай, используяSpringBoot
интегрироватьSpringSession
и использоватьRedis
практика в качестве хранилищаSpringSession
использование.
Подготовка окружающей среды
потому что нужно использоватьRedis
как нижний слойSession
носитель для достижения распределенногоsession
, так что нужно установитьRedis
.
Установка Redis
1. ИзОфициальный сайтЗагрузите последнюю версиюRedis
2. Декомпрессия
tar zxvf redis-5.0.0.tar.gz
3. Скомпилируйте и протестируйте
sudo make test
4. Скомпилируйте и установите
sudo make install
5. Проблемы с установкой
Если вы установили его ранее, повторили установку и не удалили полностью, будет сообщено о следующей ошибке
make[1]: *** [test] Error 1
make: *** [test] Error 2
Чтобы устранить эту ошибку, выполните следующую инструкцию:
make distclean
make
make test
Правильная установочная поза выглядит следующим образом:
6. СтартRedis
в вашейRedis
В каталоге установки естьredis-server
, выполните команду скрипта:
Хорошо, поехали,Redis
Монтажные работы завершены.
Подготовка проекта SpringBoot
Здесь мы проходим непосредственно черезIdea
построить нашSpringBoot
проект.
File->New->Project : Spring Initializr
ХОРОШО,SpringBoot
Проект готов, вот подборка для созданияWeb
проект.
интегрированный
Интеграция — это в основном введение зависимости, которая здесь требуетсяredis
иsession
зависимость
импорт зависимостей
<dependencies>
<!--redis 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--sessions 依赖-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
</dependencies>
Настроить application.properties
#服务端口
server.port=8080
#redi主机地址
spring.redis.host=localhost
#redis服务端口
spring.redis.port=6379
# spring session使用存储类型,spirngboot默认就是使用redis方式,如果不想用可以填none。
spring.session.store-type=redis
Добавьте аннотацию @EnableRedisHttpSession в класс запуска.
@SpringBootApplication
@EnableRedisHttpSession
public class SpringBootSessionApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootSessionApplication.class, args);
}
}
контрольная работа
Давайте напишемController
/**
* SessionController
*
* @author: glmapper@leishu
* @since: 18/11/3 下午3:16
* @version 1.0
**/
@Controller
@RequestMapping(value = "/")
public class SessionController {
@ResponseBody
@RequestMapping(value = "/session")
public Map<String, Object> getSession(HttpServletRequest request) {
request.getSession().setAttribute("userName", "glmapper");
Map<String, Object> map = new HashMap<>();
map.put("sessionId", request.getSession().getId());
return map;
}
@ResponseBody
@RequestMapping(value = "/get")
public String get(HttpServletRequest request) {
String userName = (String) request.getSession().getAttribute("userName");
return userName;
}
}
Результаты теста
запускатьSpringBoot
проекта, затем введите адрес в браузереhttp://локальный:8080/сеанс;
Controller
первый метод вgetSession
, этот методsession
Значение устанавливается в .
Ниже выполняем:http://localhost:8080/getвот изsession
Значение в:
Уже,SpringBoot
ИнтегрироватьSpringSession
процесс завершен. Здесь мы просто вводим зависимости, а затем делаем простую настройку, так как наши запросыSpringSession
иметь дело с этим? Исходя из нашего последовательного понимания, дляServlet
канонический контейнер (SpringBoot
используя встроенныйTomcat
), первый обрабатываемый запросFilter
. мы основаны наSpring+SpringMvc
Во время разработки этого стека технологий, если нам понадобится управление разрешениями, мыFilter
или перехватчик. Но похоже, что мы здесь ничего не делаем, но запрос действительно обрабатывается.SpringSession
обработанный. Хорошо, давайте посмотрим.
Как SpringSession обрабатывает запросы?
Скриншот выше должен быть всем знаком, даSpringBoot
Журнал запуска ; красное поле на рисунке выше показывает текущую регистрацию приложения.Filter
информации, отсюда видно, что есть иsession
СвязанныйFilter:sessionRepositoryFilter
;этоbean
Соответствующие классы:
org.springframework.boot.autoconfigure.session.SessionRepositoryFilterConfiguration.ConditionalOnBean=
org.springframework.session.web.http.SessionRepositoryFilter
нашел здесь
участие здесьSpringBoot
Автоматическая конфигурация изspring-boot-autoconfig
Скачать пакетspring-autoconfigure-metadata.properties
файл конфигурации, а затем получить всю информацию, которая поддерживает автоматическую настройку;SpringSession
Также в нем. Как загрузить и зарегистрироваться выходит за рамки данной статьи, продолжаем разбиратьSpringSession
процесс обработки.
Обработка SpringSession
сверхуSpringBoot
Процесс запуска мы нашли дескрипторsession
изFilter
, а затем знать, что он зарегистрирован в текущем контейнере с помощью автоматической настройки и обрабатывает запросы.
@Order(SessionRepositoryFilter.DEFAULT_ORDER)
public class SessionRepositoryFilter<S extends Session>
extends OncePerRequestFilter {
отSessionRepositoryFilter
Из определения:
- 1. используется
Order
, и настроено с небольшим значением (Integer.MIN_VALUE + 50
), чтобы убедиться, чтоsession
изFilter
существуетFilter
Цепочка выполняется первой. - 2. Интегрированный
OncePerRequestFilter
, чтобы гарантировать, что только один проход в запросеfilter
, не повторяясь
Почемуsession
изFilter
Быть в приоритете? Поскольку наш запрос завернут, еслиSessionRepositoryFilter
Отсутствие приоритета запросов может привести к непоследовательному поведению последующих запросов, что включает в себяspringSession
Беспроблемная замена серверов приложенийrequest
Принцип:
- 1. Настроить
Filter
,выполнитьdoFilter
метод - 2. Наследование
HttpServletRequestWrapper
,HttpServletResponseWrapper
класс, переопределитьgetSession
и другие связанные методы (в этих методах вызов связанныхsession
класс эксплуатации контейнера хранения). - 3. Настроить
request
иresponse
классы и передавать их отдельно в цепочку фильтров - 4. Поместите
filter
Настроен на первую позицию в цепочке фильтров
Хорошо, зная эти предыстории, давайте проследим весь процесс обработки.
1. Точка останова для doFilterInternal
можно увидеть отсюдаrequest
иresponse
Класс завернут.
2. Точка останова для getSession
вот изRedis
возьми насsession
место данных
-
Начните с нашего текущего
servlet
Получите его в контейнере, если вы его получите, верните его напрямую -
идти с
Здесь будет обработка кеша, не каждый разRedis
ПриниматьReids
Проверьте один раз в середине, избегайте один раз сReids
взаимодействие.- Если кеш в настоящее время существует в кеше контейнера приложения, он будет напрямую возвращать текущий кешированный
session
- Если нет, получить его из запроса
sessionId
, а по текущемуsessionId
идти сReids
Найти вsession
данные - обновить кеш
session,sessionId,requestedSessionCached
Ожидание статуса данных
- Если кеш в настоящее время существует в кеше контейнера приложения, он будет напрямую возвращать текущий кешированный
-
если
Redis
Если да, обновитеsession
соответствующая информация и возврат -
если
Reids
не обнаружено, согласноcreate
определить, создавать ли новуюsession
.
Точка останова для чтенияCookieValues
SpringSession
Обеспечивает как сохранение, так и передачуSessionId
образом, один основан наCookie
, один основан наHeader
из.SpringSession
Значение по умолчанию основано наCookie
Путь.readCookieValues
как достичьCookie
получено вsessionId
из.
Процесс на самом деле довольно прост, начиная сrequest
Получить все данные, переносимые текущим запросом, вCookie
информацию, а затем сопоставьтеcookieName
за“SESSION”
изCookie
разобрать.
Точка останова на RedisOperationsSessionRepository -> getSession
вот изRedis
Приниматьsession
место данных
- в соответствии с
sessionId
отRedis
взято изentries
данные - Построить
RedisSession
и вернуться
Точка останова для фиксации сеанса
commitSession
функционировать черезHttpSessionIdResolver
будетsessionId
написатьresponse
и сделать его постоянным.
здесьsession
На самом деле статус обновился, типа сбросsession
срок годности и др.session
Фиксация на самом деле означает, что текущий запрос был обработан.
резюме
В этой статье сначала описывается, как использоватьSpringBoot
интегрированныйSpringSession
, и сRedis
как хранилище. Затем просто проанализируйтеSpringSession
Процесс обработки этой бумагиSpringSession
Отсутствует глубокий анализ принципиальной частиSpringSession
принцип.