В этой главе мы обсудим отслеживание сеансов в JSP. HTTP — это протокол без сохранения состояния, который означает, что каждый раз, когда клиент извлекает веб-страницу, клиент открывает отдельное соединение с веб-сервером, и сервер автоматически не ведет запись предыдущего запроса клиента.
Поддержание сеанса между веб-клиентом и сервером
Давайте теперь обсудим несколько вариантов поддержки сеанса между веб-клиентом и веб-сервером.
Печенье
Веб-сервер может назначить уникальный идентификатор сеанса в виде файла cookie каждому веб-клиенту, и для последующих запросов от клиента они могут быть распознаны с использованием полученного файла 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 — лучший способ поддерживать сеансы и работает для браузеров, когда они не поддерживают куки. Недостатком здесь является то, что вам придется динамически генерировать каждый URL для назначения идентификатора сеанса, хотя страница является простой статической страницей HTML.
Объект сеанса
Помимо вышеупомянутых опций, JSP использует сервлет HttpSession Interface. Этот интерфейс позволяет идентифицировать пользователя.
- одностраничный запрос или
- посетить веб-сайт или
- хранить информацию об этом пользователе
По умолчанию в JSP включено отслеживание сеансов, и для каждого нового клиента автоматически создается новый объект HttpSession. Отключение отслеживания сеанса требует явного отключения его путем установки атрибута сеанса директивы страницы в false следующим образом:
<%@ page session = "false" %>
Механизм JSP предоставляет объект HttpSession автору JSP через неявный объект сеанса . Поскольку объект сеанса уже предоставлен программисту JSP, программист может немедленно начать хранение и извлечение данных из объекта без какой-либо инициализации или getSession () .
Вот краткое изложение важных методов, доступных через объект сеанса —
S.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 для определения времени создания и времени последнего обращения к сеансу. Мы связали бы новый сеанс с запросом, если он еще не существует.
<%@ page import = "java.io.*,java.util.*" %> <% // Get session creation time. Date createTime = new Date(session.getCreationTime()); // Get last access time of this Webpage. 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 Webpage. if (session.isNew() ){ title = "Welcome to my website"; session.setAttribute(userIDKey, userID); session.setAttribute(visitCountKey, visitCount); } visitCount = (Integer)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); session.setAttribute(visitCountKey, visitCount); %> <html> <head> <title>Session Tracking</title> </head> <body> <center> <h1>Session Tracking</h1> </center> <table border = "1" align = "center"> <tr bgcolor = "#949494"> <th>Session info</th> <th>Value</th> </tr> <tr> <td>id</td> <td><% out.print( session.getId()); %></td> </tr> <tr> <td>Creation Time</td> <td><% out.print(createTime); %></td> </tr> <tr> <td>Time of Last Access</td> <td><% out.print(lastAccessTime); %></td> </tr> <tr> <td>User ID</td> <td><% out.print(userID); %></td> </tr> <tr> <td>Number of visits</td> <td><% out.print(visitCount); %></td> </tr> </table> </body> </html>
Теперь поместите приведенный выше код в main.jsp и попробуйте получить доступ к http: // localhost: 8080 / main.jsp . Как только вы запустите URL, вы получите следующий результат —
Добро пожаловать на мой сайт
Информация о сеансе
Информация о сессии | значение |
---|---|
Я бы | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Время создания | Вт июн 08 17:26:40 GMT + 04: 00 2010 |
Время последнего доступа | Вт июн 08 17:26:40 GMT + 04: 00 2010 |
Идентификатор пользователя | ABCD |
Количество посещений | 0 |
Теперь попробуйте запустить тот же JSP во второй раз, вы получите следующий результат.
Добро пожаловать обратно на мой сайт
Информация о сеансе
тип информации | значение |
---|---|
Я бы | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Время создания | Вт июн 08 17:26:40 GMT + 04: 00 2010 |
Время последнего доступа | Вт июн 08 17:26:40 GMT + 04: 00 2010 |
Идентификатор пользователя | ABCD |
Количество посещений | 1 |
Удаление данных сеанса
Когда вы закончите с данными сеанса пользователя, у вас есть несколько вариантов —
-
Удалить определенный атрибут. Вы можете вызвать открытый метод void removeAttribute (String name), чтобы удалить значение, связанное с конкретным ключом.
-
Удалить весь сеанс. Вы можете вызвать открытый метод void invalidate (), чтобы отменить весь сеанс.
-
Установка времени ожидания сеанса. Вы можете вызвать открытый метод void setMaxInactiveInterval (int interval), чтобы установить время ожидания для сеанса индивидуально.
-
Выйти из системы — на серверах, которые поддерживают сервлеты 2.4, вы можете вызвать logout для выхода клиента из Web-сервера и аннулирования всех сеансов, принадлежащих всем пользователям.
-
Конфигурация web.xml. Если вы используете Tomcat, кроме вышеупомянутых методов, вы можете настроить время ожидания сеанса в файле web.xml следующим образом.
Удалить определенный атрибут. Вы можете вызвать открытый метод void removeAttribute (String name), чтобы удалить значение, связанное с конкретным ключом.
Удалить весь сеанс. Вы можете вызвать открытый метод 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.