English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
HTTP является протоколом без состояния, что означает, что каждый раз, когда клиент загружает веб-страницу, необходимо открывать отдельное соединение с сервером, поэтому сервер не запоминает никакой информации о предыдущих запросах клиента.
Есть три способа поддерживать сеанс между клиентом и сервером:
Серверная сеть может определить уникальный идентификатор сеанса в качестве файла cookie для каждого клиента, чтобы идентифицировать следующие запросы этого клиента.
Это может не быть эффективным способом, так как часто браузеры не поддерживают файлы cookie, поэтому мы не рекомендуем использовать этот метод для поддержания сеанса.
Серверная сеть может отправить скрытый HTML-поле формы и уникальный идентификатор сеанса, как показано ниже:
<input type="hidden" name="sessionid" value="12345">
Этот элемент означает, что при отправке формы指定的 имя и значение автоматически включаются в данные GET или POST. Каждый раз, когда браузер отправляет запрос, значение session_id можно использовать для сохранения следа различных браузеров.
Этот метод может быть эффективным, но при нажатии на ссылки в теге <A HREF> не происходит события передачи формы, поэтому поддержка скрытых полей для общего отслеживания сеансов также не поддерживается.
Вы можете добавить дополнительные данные в конце каждого URL, чтобы отличить сеансы, сервер может использовать эти данные для ассоциации сеансовых идентификаторов.
Например, http://oldtoolbag.com/file.htm;sessionid=12345, сеансовый идентификатор - sessionid=12345, сервер может использовать эту информацию для идентификации клиента.
По сравнению с этим, перезапись URL - это更好的 способ, даже если браузер не поддерживает cookies, он также работает, но недостаток в том, что вам нужно динамически указывать сеансовый ID для каждого URL, даже если это простая страница HTML.
Кроме вышеупомянутых методов, JSP использует интерфейс HttpSession, предоставляемый servlet, чтобы идентифицировать пользователя, хранить все данные о посещениях этого пользователя.
По умолчанию, JSP позволяет отслеживать сеансы, новый объект HttpSession автоматически создается для нового клиента. Запрет отслеживания сеансов требует явного его отключения, установив значение атрибута session в странице page directive в false, как показано ниже:
<%@ page session="false" %>
JSP-движок экспортирует скрытый объект сеанса перед разработчиками. Благодаря наличию объекта сеанса, разработчики могут легко хранить или извлекать данные.
В таблице ниже перечислены некоторые важные методы объекта сеанса:
S.N. | Метод & Описание |
---|---|
1 | public Object getAttribute(String name) Возвращает объект, связанный с указанным именем в объекте сеанса, если объект не существует,则在озвращает null |
2 | public Enumeration getAttributeNames() Возвращает все имена объектов в объекте сеанса |
3 | public long getCreationTime() Возвращает время создания сеанса сессии в миллисекундах, начиная с полуночи 1 января 1970 года |
4 | public String getId() 返回session对象的ID |
5 | public long getLastAccessedTime() 返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起 |
6 | public int getMaxInactiveInterval() 返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开 |
7 | public void invalidate() 将session无效化,解绑任何与该session绑定的对象 |
8 | public boolean isNew() 返回是否为一个新的客户端,或者客户端是否拒绝加入session |
9 | public void removeAttribute(String name) 移除session中指定名称的对象 |
10 | public void setAttribute(String name, Object value) 使用指定的名称和值来产生一个对象并绑定到session中 |
11 | public void setMaxInactiveInterval(int interval) 用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效 |
这个实例描述了如何使用HttpSession对象来获取创建时间和最后一次访问时间。我们将会为request对象关联一个新的session对象,如果这个对象尚未存在的话。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*" %> <% // 获取session创建时间 Date createTime = new Date(session.getCreationTime()); // 获取最后访问页面的时间 Date lastAccessTime = new Date(session.getLastAccessedTime()); String title = "再次访问基础教程网示例"; Integer visitCount = new Integer(0); String visitCountKey = 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); } else { visitCount = (Integer)session.getAttribute(visitCountKey); visitCount += 1; userID = (String)session.getAttribute(userIDKey); session.setAttribute(visitCountKey, visitCount); } %> <html> <head> <title>Отслеживание сессии</title> </head> <body> <h1>Отслеживание сессии</h1> <table border="1" 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> <tr> <td>Время последнего посещения</td> <td><% out.print(lastAccessTime); %></td> </tr> <tr> <td>ID пользователя</td> <td><% out.print(userID); %></td> </tr> <tr> <td>Количество посещений</td> <td><% out.print(visitCount); %></td> </tr> </table> </body> </html>
Попробуйте посетить http://localhost:8080/testjsp/main.jsp В первый раз выполнения будет получен следующий результат:
При повторном посещении вы получите следующие результаты:
После обработки данных сессии пользователя можно выбрать одно из следующих действий:
Удаление конкретного атрибута:
Используйте метод public void removeAttribute(String name) для удаления указанного атрибута.
Удаление всей сессии:
Используйте метод public void invalidate() для аннулирования всей сессии.
Настройка срока действия сессии:
Используйте метод public void setMaxInactiveInterval(int interval) для установки времени простоя сессии.
Выйти пользователя:
Серверы, поддерживающие версию servlet 2.4, могут вызывать метод logout() для выхода пользователя и аннулирования всех связанных сессий.
Настройка файла web.xml:
Если используется Tomcat, можно настроить файл web.xml следующим образом:
<session-config> <session-timeout>15</session-timeout> </session-config>
Превышение времени в минутах, время простоя по умолчанию в Tomcat составляет 30 минут.
Метод getMaxInactiveInterval( ) в Servlet возвращает время простоя в секундах. Если в web.xml настроено 15 минут, то getMaxInactiveInterval( ) вернет 900.