JSP Сессия
HTTP — это протокол без сохранения состояния, что означает, что каждый раз, когда клиент получает веб-страницу, открывается отдельное соединение с сервером, поэтому сервер не сохраняет никакой информации о предыдущих запросах клиента.
Существует три способа поддержания сессии между клиентом и сервером:
Cookies
Веб-сервер может назначить уникальный идентификатор сессии в качестве cookie, чтобы представлять каждого клиента, и использовать его для идентификации последующих запросов этого клиента.
Это может быть неэффективным методом, потому что во многих случаях браузеры не обязательно поддерживают cookie, поэтому мы не рекомендуем использовать этот метод для поддержания сессий.
Скрытые поля формы
Веб-сервер может отправить скрытое поле HTML-формы вместе с уникальным идентификатором сессии, например так:
<input type="hidden" name="sessionid" value="12345">
Эта запись означает, что при отправке формы указанное имя и значение будут автоматически включены в данные GET или DO. Всякий раз, когда браузер отправляет запрос, значение session_id может использоваться для отслеживания различных браузеров.
Этот метод может быть эффективным, но нажатие на гиперссылки в тегах <A HREF> не генерирует события отправки формы, поэтому скрытые поля формы также не поддерживают общее отслеживание сессий.
Перезапись URL
Вы можете добавить некоторые дополнительные данные после каждого URL, чтобы различать сессии, и сервер может связать идентификаторы сессий на основе этих данных.
Например, http://w3cschool.cc/file.htm;sessionid=12345, идентификатор сессии — sessionid=12345, и сервер может использовать эти данные для идентификации клиента.
Напротив, перезапись URL — лучший способ, потому что она работает, даже если браузер не поддерживает cookie, но недостаток в том, что вы должны динамически указывать идентификатор сессии для каждого URL, даже для простой HTML-страницы.
объект session
В дополнение к вышеперечисленным методам JSP использует интерфейс HttpSession, предоставляемый сервлетами, для идентификации пользователя и хранения всей информации о доступе для этого пользователя.
По умолчанию JSP включает отслеживание сессии, и для новых клиентов автоматически будет создан новый объект HttpSession. Чтобы отключить отслеживание сессии, необходимо явно выключить его, установив атрибут session в директиве page в значение false, как показано ниже:
<%@ page session="false" %>
Движок JSP предоставляет разработчикам неявный объект session. С помощью предоставленного объекта session разработчики могут удобно сохранять или извлекать данные.
В следующей таблице перечислены некоторые важные методы объекта session:
| S.N. | Метод & Описание |
|---|---|
| 1 | public Object getAttribute(String name) |
Приложение сеанса JSP
В этом примере описывается, как использовать объект HttpSession для получения времени создания и времени последнего доступа. Мы свяжем новый объект сеанса с объектом запроса, если он еще не существует.
<%@ 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 = "再次访问Example实例";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// 检测网页是否有新的访问用户
if (session.isNew()){
title = "访问Example实例";
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>Session 跟踪</title>
</head>
<body>
<h1>Session 跟踪</h1>
<table border="1" align="center">
<tr bgcolor="#949494">
<th>Session 信息</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.
Другие расширения