JavaRush /Курсы /JSP & Servlets /Работа сервлета с сессиями

Работа сервлета с сессиями

JSP & Servlets
12 уровень , 3 лекция
Открыта

4.1 Знакомство с HttpSession

Если несколько запросов идут от одного клиента, то говорят, что между клиентом и сервером установилась сессия. Для контроля этого процесса у контейнера есть специальный объект HttpSession.

Когда клиент обращается к сервлету, то контейнер сервлетов проверяет, есть ли в запросе параметр ID сессии. Если такой параметр отсутствует (например, клиент первый раз обращается к серверу), тогда контейнер сервлетов создает новый объект HttpSession, а также присваивает ему уникальный ID.

Объект сессии сохраняется на сервере, а ID отправляется в ответе клиенту и по умолчанию сохраняется на клиенте в куках. Затем, когда приходит новый запрос от того же клиента, то контейнер сервлетов достает из него ID, и по этому ID находит правильный объект HttpSession на сервере.

Получить объект сессии можно из запроса (объект HttpServletRequest), у которого нужно вызвать метод getSession(). Он возвращает объект HttpSession.

Зачем нужна сессия? В ней можно хранить информацию о клиенте между вызовами. У нее внутри есть что-то вроде HashMap, в котором можно хранить объекты по ключам. И несколько методов для этого:

Методы Описание
1 setAttribute(String name, Object o) Добавляет объект внутрь сессии
2 getAttribute(String name) Получает объект из сессии
3 removeAttribute(String name) Удаляет объект из сессии

Давай напишем сервлет, который будет суммировать все передаваемые ему числа из разных запросов:



public class CalculatorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
         // Получаем атрибут “sum” из сессии 
        HttpSession session = request.getSession();
        Integer sum = (Integer) session.getAttribute("sum");
        //Обрабатываем ситуацию, когда такого атрибута у сессии еще нет
        if (sum == null)
            sum = 0; 
 
         // Получаем параметр “n” из запроса
        String n = request.getParameter("n");
        sum += Integer.parseInt(n);
 
         // Записываем атрибут “sum” в сессию
        session.setAttribute("sum", sum);
 
        // Печатаем HTML в качестве ответа для браузера
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head> <title> CalculatorServlet </title> </head>");
        out.println("<body>");
        out.println("<h1> Sum == " + sum + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

4.2 Подробнее об HttpSession

Что еще важного мы не сказали об объекте HttpSession?

Во-первых, это имя JSESSIONID. Именно под ним в куках хранится ID сессии. Как видите, запомнить его довольно легко: J+SESSION+ID.

Во-вторых, у сессии есть еще несколько полезных методов:

Методы Описание
1 getAttributeNames() Возвращает список всех ключей, которые храниться в сессии
2 getId() Возвращает ID-сессии (строка)
3 isNew() Возвращает true, если объект сессии был создан в текущем запросе
4 setMaxInactiveInterval(int seconds) Устанавливает интервал неактивности сессии в секундах
5 invalidate() Удаляет из сессии все объекты

Тут все методы очевидны, а про setMaxInactiveInterval() мы поговорим немного подробнее.

Если сервер будет хранить десятки тысяч сессий, включая данные клиентов, которые заходили к нему в прошлом месяце, то у него банально закончиться память. Поэтому есть способ установить “время жизни сессии”.

Если в течение interval времени сессией никто не пользовался, то она самоочищается — из нее удаляются все объекты, которые она хранила. Это сделано для экономии памяти.

По умолчанию этот интервал равен 1800 секундам == 30 минутам. Если установить значение -1, то сессия будет “вечной” и удалится только когда пользователь закроет вкладку браузера (ну или клиент разорвет соединение).

Примеры:


// получение всех ключей
Enumeration keys = session.getAttributeNames();
while( keys.hasMoreElements() ){
    System.out.println( (String) keys.nextElement() );
}

        

// установка интервала неактивности
session.setMaxInactiveInterval(60*60*24);   // 1 день
session.setMaxInactiveInterval(-1); // до закрытия браузера
        

// удаление всех данных из сессии
session.invalidate();
        
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Олег Уровень 111 Expert
4 августа 2023
Объект HttpSession представляет сессию, которая предоставляет возможность сохранять информацию о состоянии между различными запросами от одного и того же клиента (обычно веб-браузера) на сервере. Сессия позволяет сохранять данные, которые будут доступны на протяжении всей сессии в пределах одного пользователя, даже если между запросами не передаются эти данные явно. 1. Создание сессии: Когда клиент (веб-браузер) делает первый запрос к серверу, сервер создает новый объект HttpSession и связывает его с клиентом. Каждая сессия имеет свой уникальный идентификатор (Session ID), который используется для идентификации сессии на сервере. 2. Получение объекта HttpSession: В сервлете или JSP можно получить объект HttpSession с помощью метода getSession() из объекта HttpServletRequest. Если сессия уже существует для данного клиента, то метод вернет существующую сессию, иначе создаст новую. 3. Работа с данными в сессии: После получения объекта HttpSession, можно использовать его для сохранения и получения данных внутри сессии. Данные сохраняются в сессии в виде атрибутов с помощью методов setAttribute() и getAttribute(). 4. Истечение сессии: Сессия имеет время жизни, которое задается настройками контейнера. По истечении времени жизни сессия может считаться недействительной. После истечения срока действия или явного удаления сессии данные, связанные с этой сессией, становятся недоступными. 5. Удаление сессии: Сессию можно явно удалить с помощью метода invalidate(). Это может быть полезно, например, при выходе пользователя из системы или в других сценариях, когда сессия становится ненужной.
Nikita Shamrai Уровень 8 Expert
19 августа 2022
Код из первого примера не работает. Во первых в 5 строке метод getAttribute возвращает Object, a не Integer. В 12 строке вообще якобы к Integer прибавляется String. Исправление строки 5: Integer sum = (Integer) session.getAttribute("sum"); Исправление строки 12: if (n != null) { sum += Integer.parseInt(n); }
Алексей Уровень 91 Expert
23 августа 2022
еще бы в try-catch обернуть, а то мало ли что в запросе придет