Сессии

Последнее обновление: 21.09.2018

Сессия позоляет сохранять некоторую информацию на время сеанса. Когда клиент обращается к сервлету или странице JSP, то движок сервлетов проверяет, определен ли в запросе параметр ID сессии. Если такой параметр неопределен (например, клиент первый раз обращается к приложению), тогда движок сервлетов создает уникальное значение ID и связанный с ним объект сессии. Объект сессии сохраняется на сервере, а ID оправляется в ответе клиенту и по умолчанию сохраняется на клиенте в куках. Затем когда приходит новый запрос от того же клиента, то движок сервлетов опять же может получить ID и сопоставить его с объектом сессии на веб-сервере.

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

Для получения объекта сессии в сервлете у объекта HttpServletRequest определен метод getSession(). Он возвращает объект HttpSession.

HttpSession session = request.getSession();

Для управления сессией объект HttpSession предоставляет ряд методов:

  • setAttribute(String name, Object o): сохраняет в сессии под ключом name

  • getAttribute(String name): возвращает из сессии объект с ключом name. Если ключа name в сессии неопределено, то возвращается null

  • removeAttribute(String name): удаляет из сессии объект с ключом name

Например, определим следующий сервлет:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    		throws ServletException, IOException {
    	
    	// получаем сессию
    	HttpSession session = request.getSession();
    	// получаем объект name
    	String name = (String) session.getAttribute("name");
    	
    	PrintWriter out = response.getWriter();
    	try {
    		// если объект ранее не установлен
    		if(name == null) {
    			// устанавливаем объект с ключом name
    			session.setAttribute("name", "Tom Soyer");
    			out.println("Session data are set");
    		}
    		else {
    			out.println("Name: " + name);
    			// удаляем объект с ключом name
    			session.removeAttribute("name");
    		}
    	}
    	finally {
    		out.close();
    	}
    }
}

В данном случае мы получаем из сессии объект с ключом name. Если он не определен, то добавляем его в сессию, если определен - то удаляем. Таким образом, при первом запросе к приложению, в сессию будут добавлены данные, а при втором удалены, но мы сможем увидеть эти данные:

Session in servlets in Java EE

Подобным образом можно сохранять в сессию более сложные объекты. Допустим, у нас есть следующий класс, который представляет пользователя:

class Person{
	String name;
	int age;
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	String getName() { return name;}
	int getAge() {return age;}
}

Сохраним в сессию и получим из сессии объект этого класса:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    		throws ServletException, IOException {
    	
    	HttpSession session = request.getSession();
    	Person tom = (Person) session.getAttribute("person");
    	
    	PrintWriter out = response.getWriter();
    	try {
    		if(tom == null) {

    			tom = new Person("Tom", 34);
    			session.setAttribute("person", tom);
    			out.println("Session data are set");
    		}
    		else {
    			out.println("Name: " + tom.getName() + " Age: " + tom.getAge());
    			session.removeAttribute("person");
    		}
    	}
    	finally {
    		out.close();
    	}
    }
}

В данном случае также если объект по ключу "person" не установлен, то он устанавливается, иначе удаляется.

Дополнительные методы HttpSession

Кроме выше рассмотренных методов HttpSession есть еще ряд методов, которые могут быть полезны. Некоторые из них:

  • getAttributeNames(): возвращает объект java.util.Enumeration, который содержит все ключи имеющих в сессии объектов

  • getId(): возвращает идентификатор сессии в виде строки

  • isNew(): возвращает true, если для клиента еще не установлена сессия (клиент сделал первый запрос или на клиенте отключены куки)

  • setMaxInactiveInterval(int seconds): устанавливает интервал неактивности в секундах. И если в течение этого интервала клиент был неактивен, то данные сессии данные удаляются. По умолчанию максимальный интервал неактивности 1800 секунд. Значение -1 указывает, что сессия удаляется только тогда, когда пользователь закрыл вкладку в браузере.

  • invalidate(): удаляет из сессии все объекты

Применение методов:

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

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

// удаление всех данных из сессии
session.invalidate();
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850