Сервлеты - Отслеживание сеанса

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-адресов - лучший способ поддерживать сеансы, и он работает даже тогда, когда браузеры не поддерживают файлы cookie. Недостатком перезаписи URL является то, что вам придется динамически генерировать каждый URL для присвоения идентификатора сеанса, даже в случае простой статической HTML-страницы.

Объект HttpSession

Помимо вышеупомянутых трех способов, сервлет предоставляет интерфейс HttpSession, который обеспечивает способ идентификации пользователя при более чем одном запросе страницы или посещении веб-сайта, а также для хранения информации об этом пользователе.

Контейнер сервлета использует этот интерфейс для создания сеанса между HTTP-клиентом и HTTP-сервером. Сеанс сохраняется в течение определенного периода времени при более чем одном запросе соединения или страницы от пользователя.

Вы получите объект HttpSession, вызвав общедоступный метод getSession() HttpServletRequest, как показано ниже -

HttpSession session = request.getSession();

Вам необходимо вызвать request.getSession () перед отправкой любого содержимого документа клиенту. Вот краткое изложение важных методов, доступных через объект HttpSession:

Sr. No. Метод и описание
1

public Object getAttribute(String name)

Этот метод возвращает объект, связанный с указанным именем в этом сеансе, или null, если ни один объект не привязан к имени.

2

public Enumeration 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(

Этот метод возвращает истину, если клиент еще не знает о сеансе или если клиент решает не присоединяться к сеансу.

9

public void removeAttribute(String name)

Этот метод удаляет объект, связанный с указанным именем из этого сеанса.

10

public void setAttribute(String name, Object value)

Этот метод связывает объект с этим сеансом, используя указанное имя.

11

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

Удаление данных сеанса

Когда вы закончите с данными сеанса пользователя, у вас есть несколько вариантов:

  • Remove a particular attribute- Вы можете вызвать общедоступный метод void removeAttribute (String name), чтобы удалить значение, связанное с определенным ключом.

  • Delete the whole session- Вы можете вызвать метод public void invalidate (), чтобы отказаться от всего сеанса.

  • Setting Session timeout- Вы можете вызвать общедоступный метод void setMaxInactiveInterval (int interval), чтобы индивидуально установить тайм-аут для сеанса.

  • Log the user out - Серверы, поддерживающие сервлеты 2.4, можно вызывать logout для выхода клиента из веб-сервера и аннулирования всех сеансов, принадлежащих всем пользователям.

  • web.xml Configuration - Если вы используете Tomcat, помимо вышеупомянутых методов, вы можете настроить время ожидания сеанса в файле web.xml следующим образом.

<session-config>
   <session-timeout>15</session-timeout>
</session-config>

Тайм-аут выражается в минутах и ​​отменяет тайм-аут по умолчанию, который в Tomcat составляет 30 минут.

Метод getMaxInactiveInterval () в сервлете возвращает период ожидания для этого сеанса в секундах. Итак, если ваш сеанс настроен в web.xml на 15 минут, getMaxInactiveInterval () вернет 900.