Главная » Java, Web » Поддержание сессий

0

Протокол HTTP не поддерживает сессии автоматически. Для поддержки сессий могут использоваться другие механизмы. Существует, по крайней мере, три стандартных подхода.

?   Cookies.

Для хранения информации, которая служит для идентификации сессии и сбора данных при работе с сессиями, могут быть использованы cookie.

?   Запись информации сессии в составе URL.

Информация о сессии и данные сессии могут быть переданы в составе url. Однако если пользователь покидает сайт, то при повторном его возвращении информация о сессии будет потеряна.

?    Скрытые элементы <input> в форме.

Информация о сессии может быть передана посредством скрытых форм В HTML-ярлыке < IN PUT TYPE="HIDDEN" NAME=" session" VALUE=" . . . ">.

Сервлеты обладают набором средств для работы с сессиями — HttpSession. Этот интерфейс основан на технике использования Cookies и организации сессий с перезаписью URL. Второй вариант используется тогда, когда клиент не поддерживает Cookies или если они отключены. При использовании HttpSession нет необходимости касаться всех деталей работы этого механизма. В этом удобство такого интерфейса. При этом работа с сессиями производится довольно прямолинейно и очевидно. Чтобы найти объект HttpSession, который работает с данным запросом, вызывается метод getsession интерфейса HttpServletRequest. Если метод возвращает null, то мы имеем возможность создать новую сессию. Сессия может быть создана автоматически. Для этого необходимо в качестве аргумента метода getSession указать значение true:

HttpSession session = request.getSession(true);

Объекты типа HttpSession располагаются на сервере. Они связаны с конкретными запросами. Объекты эти имеют свою внутреннюю структуру, которая определяется произвольным набором ключей. Значение ключа может быть получено при помощи метода getValue ("key"). Метод возвращает объект типа object. Далее этот объект должен быть приведен к более конкретному типу, который соответствует запрошенному ключу. Если атрибут не задан, то возвращаемое значение будет null. Это устаревший метод, новый метод — getAttribute. Соответствующий ему метод setAttribute позволяет осуществлять контроль за значениями. Этот метод определен в HttpSessionBindingListener. Ниже приводится небольшой пример с корзиной для покупок.

HttpSession session = request.getSession(true); ShoppingCart previousltems =

(ShoppingCart)session.getValue("previousltems"); if (previousltems != null) {

doSomethingWith(previousltems); } else {

previousltems = new ShoppingCart(…); doSomethingElseWith(previousltems);

}

Список всех атрибутов можно получить с помощью метода getValueNames, который возвращает массив строк string. Более новый вариант этого метода — метод getAttributeNames.

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

? getld

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

единственное ключевое значение, которое идентифицируется этим идентификатором как ключом.

?   isNew

Метод возвращает true, если клиент не работал с сессией (сессия только что создана). В противном случае возвращается false.

?   getCreationTime

Возвращает время создания сессии в миллисекундах. Чтобы получить удобно читаемое выражение, полученное время передается конструктору класса Date ИЛИ методу setTimelnMillis ИЗ GregorianCalendar.

?   getLastAccessedTime

Возвращает время последней отправки сессии клиентом в миллисекундах.

?   getMaxInactivelnterval

Задает интервал в секундах. По истечении этого времени сессия будет прекращена. Отрицательное значение соответствует отсутствию заданного времени уничтожения сессии.

Информация, связанная с сессией, может быть получена с использованием методов getvalue или getAttribute. Для задания информации и вставки ее в сессию, используются методы putvalue или setAttribute. Например,

HttpSession session = request.getSession(true);

session.putValue("referringPage", request.getHeader("Referer")); ShoppingCart previousltems =

(ShoppingCart)session.getValue("previousltems"); if (previousltems == null) {

previousltems = new ShoppingCart(…);

String itemID = request.getParameter("itemID"); previousltems.addEntry(Catalog.getEntry(itemID)); session.putValue("previousltems", previousltems); Далее вашему вниманию предлагается пример страницы, которая выводит информацию о текущей сессии (листинг 4.21). Результат выполнения этого кода можно увидеть на рис. 4.19.

j Листинг 4.21. Файл ShowSession.java                                                                     j

package paket; import java.io.*; import javax.servlet.*; import javax.servlet.http.*;

import java.net.*; import java.util.*;

public class ShowSession extends HttpServlet { public void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Searching the Web"; String heading;

Integer accessCount = new Integer(0);; if (session.isNew()) {

heading = "Welcome, Newcomer"; } else {

heading = "Welcome Back"; Integer оIdAccessCount =

(Integer)session.getValue("accessCount"); if (oldAccessCount != null) { accessCount =

new Integer(oldAccessCount.intValue() + 1);

}

}

session.putValue("accessCount", accessCount); out.println(ServletUtilities.headWithTitle(title) + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + heading + "</Hl>\n" + "<H2>Information on Your Session:</H2>\n" + "CTABLE BORDER=l ALIGN=CENTER>\n" + "<TR BGCOLOR=\"#FFADO0\">\n" + " <TH>Info Type<TH>Value\n" + "<TR>\n" + " <TD>ID\n" +

" <TD>" + session.getld() + "\n" + "<TR>\n" +

" <TD>Creation Time\n" +

" <TD>" + new Date(session.getCreationTime()) + "\n" + "<TR>\n" +

" <TD>Time of Last Access\n" +

" <TD>" + new Date(session.getLastAccessedTime ()) + "\n" + "<TR>\n" +

" <TD>Number of Previous Accesses\n" + " <TD>" + accessCount + "\n" + "</TABLE>\n" + "</BODYX/HTML>") ;

}

public void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException { doGet(request, response);

}

Рис. 4.19. Вывод информации о текущей сессии

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии