Servlets - Sitzungsverfolgung

HTTP ist ein "zustandsloses" Protokoll. Dies bedeutet, dass der Client jedes Mal, wenn ein Client eine Webseite abruft, eine separate Verbindung zum Webserver herstellt und der Server automatisch keine Aufzeichnungen über vorherige Clientanforderungen führt.

Es gibt jedoch drei Möglichkeiten, die Sitzung zwischen Webclient und Webserver aufrechtzuerhalten:

Kekse

Ein Webserver kann jedem Webclient eine eindeutige Sitzungs-ID als Cookie zuweisen, und für nachfolgende Anforderungen des Clients können sie anhand des empfangenen Cookies erkannt werden.

Dies ist möglicherweise kein effektiver Weg, da viele Zeitbrowser kein Cookie unterstützen. Daher würde ich nicht empfehlen, dieses Verfahren zur Aufrechterhaltung der Sitzungen zu verwenden.

Versteckte Formularfelder

Ein Webserver kann ein verstecktes HTML-Formularfeld zusammen mit einer eindeutigen Sitzungs-ID wie folgt senden:

<input type = "hidden" name = "sessionid" value = "12345">

Dieser Eintrag bedeutet, dass beim Senden des Formulars der angegebene Name und Wert automatisch in den GET- oder POST-Daten enthalten sind. Jedes Mal, wenn ein Webbrowser eine Anfrage zurücksendet, kann der Wert session_id verwendet werden, um den Überblick über verschiedene Webbrowser zu behalten.

Dies könnte eine effektive Methode sein, um die Sitzung zu verfolgen. Wenn Sie jedoch auf einen regulären (<A HREF...>) Hypertext-Link klicken, wird kein Formular gesendet, sodass ausgeblendete Formularfelder auch die allgemeine Sitzungsverfolgung nicht unterstützen können.

URL-Umschreibung

Sie können am Ende jeder URL, die die Sitzung identifiziert, einige zusätzliche Daten anhängen, und der Server kann diese Sitzungskennung mit Daten verknüpfen, die er über diese Sitzung gespeichert hat.

Bei http://tutorialspoint.com/file.htm;sessionid = 12345 wird die Sitzungskennung beispielsweise als Sitzungs-ID = 12345 angehängt, auf die auf dem Webserver zugegriffen werden kann, um den Client zu identifizieren.

Das Umschreiben von URLs ist eine bessere Möglichkeit, Sitzungen aufrechtzuerhalten, und funktioniert auch dann, wenn Browser keine Cookies unterstützen. Der Nachteil des erneuten Schreibens von URLs besteht darin, dass Sie jede URL dynamisch generieren müssen, um eine Sitzungs-ID zuzuweisen, selbst bei einer einfachen statischen HTML-Seite.

Das HttpSession-Objekt

Abgesehen von den oben genannten drei Möglichkeiten bietet das Servlet eine HttpSession-Schnittstelle, mit der ein Benutzer über mehr als eine Seitenanforderung oder einen Besuch auf einer Website identifiziert und Informationen über diesen Benutzer gespeichert werden können.

Der Servlet-Container verwendet diese Schnittstelle, um eine Sitzung zwischen einem HTTP-Client und einem HTTP-Server zu erstellen. Die Sitzung bleibt für einen bestimmten Zeitraum über mehrere Verbindungs- oder Seitenanforderungen des Benutzers hinweg bestehen.

Sie würden das HttpSession-Objekt erhalten, indem Sie die öffentliche Methode aufrufen getSession() von HttpServletRequest, wie unten -

HttpSession session = request.getSession();

Sie müssen request.getSession () aufrufen, bevor Sie Dokumentinhalte an den Client senden. Hier ist eine Zusammenfassung der wichtigen Methoden, die über das HttpSession-Objekt verfügbar sind:

Sr.Nr. Methode & Beschreibung
1

public Object getAttribute(String name)

Diese Methode gibt das Objekt zurück, das in dieser Sitzung mit dem angegebenen Namen gebunden ist, oder null, wenn kein Objekt unter dem Namen gebunden ist.

2

public Enumeration getAttributeNames()

Diese Methode gibt eine Aufzählung von String-Objekten zurück, die die Namen aller an diese Sitzung gebundenen Objekte enthält.

3

public long getCreationTime()

Diese Methode gibt die Zeit zurück, zu der diese Sitzung erstellt wurde, gemessen in Millisekunden seit Mitternacht, 1. Januar 1970 GMT.

4

public String getId()

Diese Methode gibt eine Zeichenfolge zurück, die den dieser Sitzung zugewiesenen eindeutigen Bezeichner enthält.

5

public long getLastAccessedTime()

Diese Methode gibt die zuletzt aufgerufene Zeit der Sitzung im Millisekundenformat seit Mitternacht des 1. Januar 1970 GMT zurück

6

public int getMaxInactiveInterval()

Diese Methode gibt das maximale Zeitintervall (Sekunden) zurück, in dem der Servlet-Container die Sitzung zwischen Clientzugriffen offen hält.

7

public void invalidate()

Diese Methode macht diese Sitzung ungültig und hebt die Bindung aller daran gebundenen Objekte auf.

8

public boolean isNew(

Diese Methode gibt true zurück, wenn der Client noch nichts über die Sitzung weiß oder wenn der Client sich dafür entscheidet, nicht an der Sitzung teilzunehmen.

9

public void removeAttribute(String name)

Diese Methode entfernt das mit dem angegebenen Namen gebundene Objekt aus dieser Sitzung.

10

public void setAttribute(String name, Object value)

Diese Methode bindet ein Objekt unter Verwendung des angegebenen Namens an diese Sitzung.

11

public void setMaxInactiveInterval(int interval)

Diese Methode gibt die Zeit in Sekunden zwischen Clientanforderungen an, bevor der Servlet-Container diese Sitzung ungültig macht.

Beispiel für die Sitzungsverfolgung

In diesem Beispiel wird beschrieben, wie Sie mit dem HttpSession-Objekt die Erstellungszeit und die Zeit für den letzten Zugriff für eine Sitzung ermitteln. Wir würden der Anfrage eine neue Sitzung zuordnen, falls noch keine existiert.

// 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>"
      );
   }
}

Kompilieren Sie das obige Servlet SessionTrackund erstellen Sie einen entsprechenden Eintrag in der Datei web.xml. Wenn Sie jetzt http: // localhost: 8080 / SessionTrack ausführen, wird beim ersten Ausführen das folgende Ergebnis angezeigt:

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

Versuchen Sie nun, dasselbe Servlet zum zweiten Mal auszuführen. Das folgende Ergebnis wird angezeigt.

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

Sitzungsdaten löschen

Wenn Sie mit den Sitzungsdaten eines Benutzers fertig sind, haben Sie mehrere Möglichkeiten:

  • Remove a particular attribute- Sie können die Methode public void removeAttribute (String name) aufrufen , um den einem bestimmten Schlüssel zugeordneten Wert zu löschen.

  • Delete the whole session- Sie können die Methode public void invalidate () aufrufen , um eine gesamte Sitzung zu verwerfen.

  • Setting Session timeout- Sie können die Methode public void setMaxInactiveInterval (int interval) aufrufen , um das Zeitlimit für eine Sitzung einzeln festzulegen .

  • Log the user out - Die Server, die Servlets 2.4 unterstützen, können Sie aufrufen logout um den Client vom Webserver abzumelden und alle Sitzungen aller Benutzer ungültig zu machen.

  • web.xml Configuration - Wenn Sie Tomcat verwenden, können Sie neben den oben genannten Methoden das Sitzungszeitlimit in der Datei web.xml wie folgt konfigurieren.

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

Das Zeitlimit wird in Minuten ausgedrückt und überschreibt das Standardzeitlimit von 30 Minuten in Tomcat.

Die Methode getMaxInactiveInterval () in einem Servlet gibt die Zeitüberschreitung für diese Sitzung in Sekunden zurück. Wenn Ihre Sitzung also 15 Minuten lang in web.xml konfiguriert ist, gibt getMaxInactiveInterval () 900 zurück.