HTTP — это протокол без сохранения состояния, который означает, что каждый раз, когда клиент извлекает веб-страницу, клиент открывает отдельное соединение с веб-сервером, и сервер автоматически не сохраняет записи предыдущего запроса клиента.
Тем не менее, существуют следующие три способа поддерживать сеанс между веб-клиентом и веб-сервером:
Печенье
Веб-сервер может назначить уникальный идентификатор сеанса в виде файла cookie каждому веб-клиенту, и для последующих запросов от клиента они могут быть распознаны с использованием полученного файла cookie.
Это может быть неэффективным способом, потому что многие браузеры времени не поддерживают куки, поэтому я бы не рекомендовал использовать эту процедуру для поддержки сеансов.
Скрытые поля формы
Веб-сервер может отправить скрытое поле формы HTML вместе с уникальным идентификатором сеанса следующим образом:
<input type = "hidden" name = "sessionid" value = "12345">
Эта запись означает, что при отправке формы указанные имя и значение автоматически включаются в данные GET или POST. Каждый раз, когда веб-браузер отправляет запрос назад, значение session_id может использоваться для отслеживания различных веб-браузеров.
Это может быть эффективным способом отслеживания сеанса, но нажатие на обычную (<A HREF…>) гипертекстовую ссылку не приводит к отправке формы, поэтому скрытые поля формы также не могут поддерживать общее отслеживание сеанса.
Перезапись URL
Вы можете добавить некоторые дополнительные данные в конце каждого URL-адреса, который идентифицирует сеанс, и сервер может связать этот идентификатор сеанса с данными, которые он сохранил для этого сеанса.
Например, при http://tutorialspoint.com/file.htm;sessionid = 12345 идентификатор сеанса прикрепляется как sessionid = 12345, к которому можно обращаться на веб-сервере для идентификации клиента.
Перезапись URL — лучший способ поддерживать сеансы, и он работает, даже если браузеры не поддерживают файлы cookie. Недостаток перезаписи URL заключается в том, что вам придется динамически генерировать каждый URL для назначения идентификатора сеанса, даже в случае простой статической HTML-страницы.
Объект HttpSession
Помимо вышеупомянутых трех способов, сервлет предоставляет интерфейс HttpSession, который позволяет идентифицировать пользователя по нескольким запросам страниц или посещению веб-сайта и хранить информацию об этом пользователе.
Контейнер сервлета использует этот интерфейс для создания сеанса между клиентом HTTP и сервером HTTP. Сеанс продолжается в течение указанного периода времени, более чем через одно соединение или запрос страницы от пользователя.
Вы получите объект HttpSession, вызвав открытый метод getSession () объекта HttpServletRequest, как показано ниже:
HttpSession session = request.getSession();
Вам необходимо вызвать request.getSession (), прежде чем отправлять какое-либо содержимое документа клиенту. Вот краткое изложение важных методов, доступных через объект HttpSession —
Sr.No. | Метод и описание |
---|---|
1 |
открытый объект getAttribute (имя строки) Этот метод возвращает объект, связанный с указанным именем в этом сеансе, или ноль, если объект не связан с именем. |
2 |
публичное перечисление getAttributeNames () Этот метод возвращает Перечисление объектов String, содержащих имена всех объектов, связанных с этим сеансом. |
3 |
public long getCreationTime () Этот метод возвращает время создания сеанса, измеренное в миллисекундах с полуночи 1 января 1970 года по Гринвичу. |
4 |
public String getId () Этот метод возвращает строку, содержащую уникальный идентификатор, назначенный этому сеансу. |
5 |
public long getLastAccessedTime () Этот метод возвращает время последнего обращения к сеансу в формате миллисекунд с полуночи 1 января 1970 г. по Гринвичу |
6 |
public int getMaxInactiveInterval () Этот метод возвращает максимальный интервал времени (в секундах), в течение которого контейнер сервлета будет держать сеанс открытым между клиентскими обращениями. |
7 |
public void invalidate () Этот метод делает недействительным этот сеанс и отменяет привязку любых объектов, связанных с ним. |
8 |
public boolean isNew ( Этот метод возвращает true, если клиент еще не знает о сеансе или если клиент решает не присоединяться к сеансу. |
9 |
public void removeAttribute (String name) Этот метод удаляет объект, связанный с указанным именем из этого сеанса. |
10 |
public void setAttribute (имя строки, значение объекта) Этот метод привязывает объект к этому сеансу, используя указанное имя. |
11 |
public void setMaxInactiveInterval (int interval) Этот метод указывает время в секундах между клиентскими запросами, прежде чем контейнер сервлета аннулирует этот сеанс. |
открытый объект getAttribute (имя строки)
Этот метод возвращает объект, связанный с указанным именем в этом сеансе, или ноль, если объект не связан с именем.
публичное перечисление getAttributeNames ()
Этот метод возвращает Перечисление объектов String, содержащих имена всех объектов, связанных с этим сеансом.
public long getCreationTime ()
Этот метод возвращает время создания сеанса, измеренное в миллисекундах с полуночи 1 января 1970 года по Гринвичу.
public String getId ()
Этот метод возвращает строку, содержащую уникальный идентификатор, назначенный этому сеансу.
public long getLastAccessedTime ()
Этот метод возвращает время последнего обращения к сеансу в формате миллисекунд с полуночи 1 января 1970 г. по Гринвичу
public int getMaxInactiveInterval ()
Этот метод возвращает максимальный интервал времени (в секундах), в течение которого контейнер сервлета будет держать сеанс открытым между клиентскими обращениями.
public void invalidate ()
Этот метод делает недействительным этот сеанс и отменяет привязку любых объектов, связанных с ним.
public boolean isNew (
Этот метод возвращает true, если клиент еще не знает о сеансе или если клиент решает не присоединяться к сеансу.
public void removeAttribute (String name)
Этот метод удаляет объект, связанный с указанным именем из этого сеанса.
public void setAttribute (имя строки, значение объекта)
Этот метод привязывает объект к этому сеансу, используя указанное имя.
public void setMaxInactiveInterval (int interval)
Этот метод указывает время в секундах между клиентскими запросами, прежде чем контейнер сервлета аннулирует этот сеанс.
Пример отслеживания сеанса
В этом примере описывается, как использовать объект HttpSession для определения времени создания и времени последнего обращения к сеансу. Мы связали бы новый сеанс с запросом, если он еще не существует.
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // Extend HttpServlet class public class SessionTrack extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Create a session object if it is already not created. HttpSession session = request.getSession(true); // Get session creation time. Date createTime = new Date(session.getCreationTime()); // Get last access time of this web page. Date lastAccessTime = new Date(session.getLastAccessedTime()); String title = "Welcome Back to my website"; Integer visitCount = new Integer(0); String visitCountKey = new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD"); // Check if this is new comer on your web page. if (session.isNew()) { title = "Welcome to my website"; session.setAttribute(userIDKey, userID); } else { visitCount = (Integer)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); } session.setAttribute(visitCountKey, visitCount); // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor = \"#f0f0f0\">\n" + "<h1 align = \"center\">" + title + "</h1>\n" + "<h2 align = \"center\">Session Infomation</h2>\n" + "<table border = \"1\" align = \"center\">\n" + "<tr bgcolor = \"#949494\">\n" + " <th>Session info</th><th>value</th> </tr>\n" + "<tr>\n" + " <td>id</td>\n" + " <td>" + session.getId() + "</td> </tr>\n" + "<tr>\n" + " <td>Creation Time</td>\n" + " <td>" + createTime + " </td> </tr>\n" + "<tr>\n" + " <td>Time of Last Access</td>\n" + " <td>" + lastAccessTime + " </td> </tr>\n" + "<tr>\n" + " <td>User ID</td>\n" + " <td>" + userID + " </td> </tr>\n" + "<tr>\n" + " <td>Number of visits</td>\n" + " <td>" + visitCount + "</td> </tr>\n" + "</table>\n" + "</body> </html>" ); } }
Скомпилируйте вышеприведенный сервлет SessionTrack и создайте соответствующую запись в файле web.xml. Теперь при запуске http: // localhost: 8080 / SessionTrack будет отображать следующий результат при первом запуске —
Welcome to my website
Session Infomation
Session info | value |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2010 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2010 |
User ID | ABCD |
Number of visits | 0 |
Теперь попробуйте запустить тот же сервлет во второй раз, он будет отображать следующий результат.
Welcome Back to my website
Session Infomation
info type | value |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2010 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2010 |
User ID | ABCD |
Number of visits | 1 |
Удаление данных сеанса
Когда вы закончите с данными сеанса пользователя, у вас есть несколько вариантов —
-
Удалить определенный атрибут. Вы можете вызвать открытый метод void removeAttribute (String name), чтобы удалить значение, связанное с определенным ключом.
-
Удалить весь сеанс. Вы можете вызвать public void invalidate () для удаления всего сеанса.
-
Установка времени ожидания сеанса. Вы можете вызвать открытый метод void setMaxInactiveInterval (int interval), чтобы установить время ожидания для сеанса индивидуально.
-
Выйти из системы — на серверах, которые поддерживают сервлеты 2.4, вы можете вызвать logout для выхода клиента из Web-сервера и аннулирования всех сеансов, принадлежащих всем пользователям.
-
Конфигурация web.xml. Если вы используете Tomcat, помимо вышеупомянутых методов, вы можете настроить время ожидания сеанса в файле web.xml следующим образом.
Удалить определенный атрибут. Вы можете вызвать открытый метод void removeAttribute (String name), чтобы удалить значение, связанное с определенным ключом.
Удалить весь сеанс. Вы можете вызвать public void invalidate () для удаления всего сеанса.
Установка времени ожидания сеанса. Вы можете вызвать открытый метод void setMaxInactiveInterval (int interval), чтобы установить время ожидания для сеанса индивидуально.
Выйти из системы — на серверах, которые поддерживают сервлеты 2.4, вы можете вызвать logout для выхода клиента из Web-сервера и аннулирования всех сеансов, принадлежащих всем пользователям.
Конфигурация web.xml. Если вы используете Tomcat, помимо вышеупомянутых методов, вы можете настроить время ожидания сеанса в файле web.xml следующим образом.
<session-config> <session-timeout>15</session-timeout> </session-config>
Время ожидания выражается в минутах и переопределяет время ожидания по умолчанию, равное 30 минутам в Tomcat.
Метод getMaxInactiveInterval () в сервлете возвращает период ожидания для этого сеанса в секундах. Поэтому, если ваш сеанс настроен в web.xml на 15 минут, getMaxInactiveInterval () возвращает 900.