HTTP — это протокол без сохранения состояния. Это означает, что каждый раз, когда клиент получает веб-страницу, открывается отдельное соединение с сервером, поэтому сервер не записывает никакой информации из предыдущих клиентских запросов.
Существует три способа поддержания сеанса клиент-сервер:
Веб-сервер может назначить уникальный идентификатор сеанса в виде файла cookie для представления каждого клиента и идентификации последующих запросов от этого клиента.
Возможно, это неэффективный способ, поскольку во многих случаях браузеры не обязательно поддерживают файлы cookie, поэтому мы не рекомендуем использовать этот метод для поддержания сеанса.
Веб-сервер может отправить скрытое поле HTML-формы и уникальный идентификатор сеанса, например:
<input type="hidden" name="sessionid" value="12345">
Эта запись означает, что при отправке формы указанные имя и значение будут автоматически включены в данные GET или POST. Всякий раз, когда браузер отправляет запрос, значение session_id можно использовать для сохранения следов различных браузеров.
Этот подход может быть эффективным, но щелчок по гиперссылке в теге <A HREF> не генерирует событие отправки формы, поэтому скрытые поля формы не поддерживают универсальное отслеживание сеансов.
Вы можете добавить некоторые дополнительные данные после каждого URL-адреса, чтобы различать сеанс, и сервер может связать идентификатор сеанса на основе этих данных.
Например, http://w3cschool.cn/file.htm;sessionid=12345, идентификатор сеанса — sessionid=12345, сервер может использовать эти данные для идентификации клиента.
Для сравнения, перезапись URL-адреса — лучший способ, и он будет работать, даже если браузер не поддерживает файлы cookie, но недостатком является то, что вы должны динамически указывать идентификатор сеанса для каждого URL-адреса, даже если это простая HTML-страница.
В дополнение к вышеуказанным методам JSP использует интерфейс HttpSession, предоставляемый сервлетом, для идентификации пользователя и хранения всей информации о доступе этого пользователя.
По умолчанию JSP разрешает отслеживание сеансов, и для новых клиентов автоматически создается экземпляр нового объекта HttpSession. Отключение отслеживания сеанса требует его явного отключения, что достигается путем установки значения атрибута сеанса в директиве страницы на false, как показано ниже:
<%@page session="false" %>
Механизм JSP предоставляет разработчикам базовый объект сеанса. Поскольку предоставляется объект сеанса, разработчики могут легко сохранять или извлекать данные.
В следующей таблице перечислены некоторые важные методы объекта сеанса:
СН | Метод и описание |
---|---|
1 | public Object getAttribute(String name) возвращает объект, привязанный к указанному имени в объекте сеанса, или значение NULL, если он не существует. |
2 | public Enumeration getAttributeNames() возвращает все имена объектов в объекте сеанса |
3 | public long getCreationTime() возвращает время создания объекта сеанса в миллисекундах, начиная с раннего утра 1 января 1970 года. |
4 | public String getId() возвращает идентификатор объекта сеанса |
5 | public long getLastAccessedTime() возвращает время последнего доступа клиента в миллисекундах, начиная с раннего утра 1 января 1970 года. |
6 | public int getMaxInactiveInterval() возвращает максимальный интервал времени в секундах, в течение которого контейнер сервлетов будет держать сеанс открытым. |
7 | public voidvalidate() делает сеанс недействительным и отвязывает любые объекты, привязанные к сеансу. |
8 | public boolean isNew( возвращает, является ли это новым клиентом или клиент отказывается присоединиться к сеансу |
9 | public void removeAttribute(String name) удаляет объект с указанным именем в сеансе |
10 | public void setAttribute(String name, Object value) использует указанное имя и значение для создания объекта и привязки его к сеансу. |
11 | public void setMaxInactiveInterval(int Interval) используется для указания времени в секундах, в течение которого контейнер сервлетов будет поддерживать сессию в силе. |
В этом примере описывается, как использовать объект HttpSession для получения времени создания и времени последнего доступа. Мы свяжем новый объект сеанса с объектом запроса, если он еще не существует.
<%@ page import="java.io.*,java.util.*" %><% // Получаем время создания сеанса Date createTime = new Date(session.getCreationTime()); // Получаем время создания сеанса Дата последнего посещения LastAccessTime = new Date(session.getLastAccessedTime()); String title = «Добро пожаловать на мой сайт»; Integer visitCount = new Integer(0); new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD"); // Проверяем, посещает ли веб-страницу новый пользователь if (session.isNew()); ){ title = "Добро пожаловать на мой сайт"; session.setAttribute(userIDKey, userID); session.setAttribute(visitCountKey, visitCount); (Integer)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); session.setAttribute(visitCountKey, visitCount>Отслеживание сеанса); </title></head><body><center><h1>Отслеживание сеанса</h1></center><table align="center"> <tr bgcolor="#949494"> <th>Информация о сеансе</th> <th>Значение</th></tr> <tr> <td>id</td> <td><% out.print( session. getId()); %></td></tr> <tr> <td>Время создания</td> <td><% out.print(createTime); %></td></tr> < тр> <td>Время последнего доступа</td> <td><% out.print(lastAccessTime); %></td></tr> <tr> <td>Идентификатор пользователя</td> <td><%; out.print(userID); %></td></tr> <tr> <td>Количество посещений</td> <td><% out.print(visitCount); %></td></ тр> </table> </body></html>
Попробуйте получить доступ к http://localhost:8080/main.jsp. При первом запуске будут получены следующие результаты:
Посетите еще раз, и вы получите следующие результаты:
После обработки данных сеанса пользователя у вас есть следующие возможности:
Удалить определенный атрибут:
Вызовите метод public void removeAttribute(String name), чтобы удалить указанный атрибут.
Удалить весь сеанс:
Вызовите метод public voidvalidate(), чтобы сделать весь сеанс недействительным.
Установите срок действия сессии:
Вызовите метод public void setMaxInactiveInterval(int Interval), чтобы установить время ожидания сеанса.
Выход пользователя:
Серверы, поддерживающие сервлет версии 2.4, могут вызывать метод logout() для выхода пользователя из системы и аннулирования всех связанных сеансов.
Настройте файл web.xml:
Если вы используете Tomcat, вы можете настроить файл web.xml следующим образом:
<session-config> <session-timeout>15</session-timeout> </session-config>
Тайм-аут указывается в минутах, а тайм-аут по умолчанию в Tomcat составляет 30 минут.
Метод getMaxInactiveInterval() в сервлете возвращает время ожидания в секундах. Если в web.xml настроено 15 минут, метод getMaxInactiveInterval() вернет 900.