Spring MVC — сохранение объекта в сессии

Как сохранить объект в сессии при помощи Spring MVC? Например нам необходимо сохранять данные пользователя между запросами внутри сессии, чтобы не терять данные о сохраненных товарах в корзине. Для этого нужно хранить объект на протяжении всей сессии пользователя в нашем приложении.

1. Структура проекта

Проект полностью взят из Spring MVC – исправление проблем с русской кодировкой. Кодировка передачи параметров формы. Все настройки оттуда же. Приведу только скрин структуры:

SpringMVC_JSPHelloWorld structure

2. Общая информация

Для сохранения объектов в сессии в Spring MVC предусмотрена специальная Type-Level аннотация @SessionAttributes. Она декларирует атрибуты сессии используемые определенным обработчиком (handler’ом). Обычно это список имен или типов модели атрибутов, которые должны быть явно сохранены в сессии. Общая форма записи:

Мы указываем в аннотации @SessionAttributes перед классом какие объекты будут храниться в сессии. В примере указано, что мы будем хранить в сессии объект по имени user.

Сразу приведу листинг класса User, который и будет сохранятся в сессии:

3. Контроллер Spring MVC, запись атрибута в сессии

Если вам необходимо сохранить данные объекта (объект) между запросами, то необходимо поместить этот объект в сессию. Рассмотрим пример вызова метода main() с входным атрибутом userJSP. Атрибут может быть передан, например, с формы представления (будет показана ниже в другом примере).

Здесь мы задали какое-то имя объекту user и далее передали его в новом ModelAndView. Объект userJSP будет сохранен в сессии и будет доступен между запросами.

4. Уничтожение объектов, объявленных в сессии

Если вам необходимо уничтожить объекты в сессии, то это можно сделать с помощью передачи в метод контроллера объекта SessionStatus sessionStatus, и вызова у него метода setComplete();

После вызова метода setComplete() будет завершена Spring сессия и атрибуты, указанные в аннотации, будут удалены, но при этом сохранится HTTP сессия.

Дополнительный пример

Допустим у нас есть форма, куда вводится имя пользователя и пароль.

 

После подтверждения формы и отправки данных, сработает метод checkUser() из контроллера MainController:

После выхода из метода checkUser() вся форма (user.name и user.password) будет скопирована в http сессию, благодаря указанию аннотации у названия класса @SessionAttributes(value = «userJSP»).

5. Запуск приложения

Сначала запустим приложение с кодом из Spring MVC – Hello World

SpringMVC_JSP SaveInSession not saved

Открыв один и тот же адрес в разных окнах браузера мы увидим, что объект не сохранен.

Теперь то же самое с кодом из этой статьи:

SpringMVC_JSP SaveInSession saved

Как видим объект сохранен и доступен на протяжении сессии.

Типичные ошибки

Ошибка HTTP Status 500 — Expected session attribute ‘имяАтрибута’ возникает когда контроллер не может найти сохраненные данные по имени атрибута.

Например в нашем примере при первом заходе на «/» идет обращение к @ModelAttribute User user , но он ещё не инициализирован, поэтому происходит попытка найти это значение в сессии. Поскольку и там значения ещё нет, то вылазит вышеописанная ошибка. Если бы аннотации @SessionAttributes не было, то произошла бы инициализация объекта User user.

Чтобы убрать эту ошибку нужно сделать так, чтобы при обращении к атрибуту он уже был инициализирован (если до этого нигде не записывался, а в аннотации идет указание на этот атрибут). Это можно сделать так

Последовательность вызова методов при запуске приложения будет такая.
Сначала идет обработка аннотации @RequestMapping(«/»..), внутри метода доходим до @ModelAttribute User user. Тут он не находит объект user и переходит к User createUser()  где и происходит инициализация объекта. Затем подставляет значение в метод ModelAndView main() . *В этом примере кстати user создастся еще раз на строчке return new..

Может быть интересно

На сайте есть другая статья по работе с объектами в различных областях видимости, которая демонстрирует другой подход по сохранения объекта в сессии или запросе.

Исходные коды

SpringMVC_JSP SaveInSession

Share Button
16
20238 Total Views 3 Views Today

Добавить комментарий