Не так давно я написал пост о HTTP-сессиях в приложении Spring MVC. Это была простая статья с акцентом на практический аспект использования. В конце поста я обещал написать более сложную тему, посвященную сессиям в Spring MVC приложениях. Так что я собираюсь опубликовать этот материал.
Прежде чем начать обсуждение сессий и наиболее частых ситуаций, возникающих в процессе разработки, я хочу подчеркнуть некоторые вещи. Что такое HTTP-сессия? Зачем это существует? Надеюсь, вы знаете, что HTTP — это протокол без сохранения состояния, это означает, что между браузером и сервером нет постоянной связи. И в результате сервер не знает, кто является инициатором запроса, даже если приложение имеет только одного пользователя. Сессия представляет собой инструмент для выявления запросов автора. Предыдущее предложение достаточно грубое, но оно объясняет основную цель сессий. Каждый пользователь получает свой собственный сеанс с уникальным идентификатором при первом посещении сайта.
Получить идентификатор сессии
Вы можете получить доступ к идентификатору сеанса в приложении Spring MVC так же, как в приложении Java EE. Вам просто нужно передать объект HttpSession в аргументах метода RequestHandler и затем вызвать соответствующий метод для объекта сеанса:
1
2
3
4
5
6
7
8
9
|
... @RequestMapping (value= "/" , method=RequestMethod.GET) public ModelAndView mainPage(HttpSession session) { ModelAndView mav = new ModelAndView( "home" ); String sid = session.getId(); mav.addObject( "sid" , sid); return mav; } ... |
Получить атрибут сеанса
Когда вы хотите получить доступ к некоторому атрибуту сеанса в контроллере, вы можете использовать ту же конструкцию, что и в предыдущем фрагменте кода, но с небольшими изменениями:
1
2
3
|
... Object someObject = session.getAttribute( "nameOfAttribute" ); ... |
Если вы точно знаете, какой тип объекта будет возвращен, вы можете указать явное приведение.
Атрибут сеанса в JSP с использованием JSTL
Как получить доступ к значениям сеанса в JSP, используя JSTL после того, как вы поместили какое-то значение в сеанс в контроллере?
01
02
03
04
05
06
07
08
09
10
11
12
|
@Controller @SessionAttributes ( "sValue" ) public class NavController { ... @RequestMapping (value= "/" , method=RequestMethod.GET) public ModelAndView mainPage() { ModelAndView mav = new ModelAndView( "home" ); String sValue = "Some value" ; mav.addObject( "sValue" , sValue); return mav; } ... |
Доступ к атрибуту сеанса sValue будет выглядеть следующим образом:
1
2
3
4
5
|
... < p > ${sValue} </ p > ... |
Удалить сессию
Удаление сеанса довольно просто, вам просто нужно вызвать метод invalidate () для объекта сеанса. После этого действия сеанс будет полностью удален для конкретного пользователя.
Тайм-аут сеанса
Время ожидания сеанса определяет период жизни сеанса, в течение этого времени сеанс действителен. Самый простой способ определить время ожидания сеанса в приложениях Java EE — указать его в файле web.xml. Добавьте следующий фрагмент кода в файл web.xml вашего приложения, чтобы установить время ожидания сеанса:
1
2
3
|
< session-config > < session-timeout >10</ session-timeout > </ session-config > |
В приведенном выше примере я установил значение времени ожидания сеанса, равное 10 минутам.