Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 419

Ильдар Шаукатович Хабибуллин

ck.setMaxAge(60*60*24*183); // Cookie будет существовать полгода

resp.addCookie(ck);

Прочитать cookie из запроса клиента можно методом

public Cookie[] getCookies(); интерфейса HttpServletRequest.

Вот обычная последовательность действий по чтению cookie:

int id = 0;

Cookie[] cks = req.getCookies();

if (cks != null)

for (int i = 0; i < cks.length; i++)

if (cks[i].getName().equals("studentid")){ id = Integer.parseInt(cks[i].getValue()); break;

Использовать cookie удобно, но беда в том, что многие клиенты запрещают запись cookie-файлов, справедливо полагая, что нельзя записывать что-либо на диск без ведома хозяина.

Второе средство — параметр в строке URL (rewriting URL) — просто записывает в первую строку запроса после имени ресурса идентификатор клиента, например:

GET /some.com/InfoAppl/index.html?jsessionid=12345678 HTTP/1.1

Это тоже хороший способ, но клиент может сам формировать строку запроса, например, просто набирая ее в поле адреса браузера и забывая об идентификаторе.

Третье средство — скрытое поле HTML-формы — это поле

<input type="hidden" name="studentid" value="12345678">

в которое можно записать идентификатор клиента. Для применения данного средства надо на каждой странице HTML создавать форму.

Итак, какого-то одного универсального средства, для того чтобы создать сеанс связи с Web-сервером, нет. В пакет javax.servlet.http внесены интерфейсы и классы для облегчения распознавания клиента. Они автоматически переключаются с одного средства на другое. Если запрещены cookies, то формируется идентификатор клиента в строке URL и т. д.

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

public HttpSession getSession(boolean create);

описанным в интерфейсе HttpServletRequest. Метод возвращает объект типа HttpSession, если он существует. Если же такой объект отсутствует, то поведение метода зависит от значения аргумента create — если он равен false, то метод возвращает null, если true — создает новый объект.

Второй метод того же интерфейса

public HttpSession getSession(); эквивалентен getSession(true).

Логическим методом

public boolean isNew();

интерфейса HttpSession можно узнать, новый ли это, только что созданный сеанс (true) или продолжающийся, уже запрошенный клиентом (false).

В сеансе отмечается время его создания и время последнего запроса, которые можно получить методами

public long getCreationTime(); public long getLastAccessedTime();

Они возвращают время в миллисекундах, прошедших с полуночи 1 января 1970 года (дата рождения UNIX).

Создавая сеанс, контейнер дает ему уникальный идентификатор. Метод

public String getId();

возвращает идентификатор сеанса в виде строки.

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

public void setAttribute(String name, Object value);

Получить имена и значения атрибутов можно методами

public Enumeration getAttributeNames(); public Object getAttribute(String name);