English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
HTTP ist ein "stateless" Protokoll, was bedeutet, dass der Client bei jeder Abfrage einer Webseite eine separate Verbindung zum Web-Server öffnet und der Server automatisch keine Aufzeichnungen der vorherigen Anfragen des Clients speichert.
Es gibt jedoch weiterhin drei Methoden, um die Session-Verbindung zwischen Web-Client und Web-Server aufrechtzuerhalten:
Ein Webserver kann eine eindeutige Sitzungs-ID als Cookie für jeden Webclient zuweisen, für die nachfolgenden Anfragen des Clients kann das empfangene Cookie verwendet werden, um ihn zu identifizieren.
Dies könnte keine gültige Methode sein, da viele Browser keine Cookies unterstützen, daher empfehlen wir, diese Methode nicht zum Aufrechterhalten von Sitzungen zu verwenden.
Ein Webserver kann ein verstecktes HTML-Formularfeld sowie eine eindeutige Sitzungs-ID senden, wie folgt:
<input type="hidden" name="sessionid" value="12345">
Dieser Eintrag bedeutet, dass beim Submit des Formulars die angegebenen Namen und Werte automatisch in die GET- oder POST-Daten eingefügt werden. Jedes Mal, wenn der Webbrowser eine Anfrage zurücksendet, kann der session_id-Wert verwendet werden, um verschiedene Webbrowser zu verfolgen.
Dies könnte eine effektive Methode sein, um Sitzungstracking zu erhalten, aber das Klicken auf reguläre Hyperlinks (<A HREF...>) führt nicht zu einem Formularsubmit, daher wird das versteckte Formularfeld auch nicht für das reguläre Sitzungstracking unterstützt.
Sie können zusätzliche Daten am Ende jeder URL anhängen, um die Sitzung zu kennzeichnen, der Server verknüpft den Sitzungs-Identifier mit den gespeicherten Sitzungsdaten.
Beispielsweise, http://oldtoolbag.com/file.htm;sessionid=12345, die Sitzungs-ID wird als sessionid= angehängt12345, der von dem Webserver abgerufen werden kann, um den Client zu identifizieren.
URL-Rewriting ist eine bessere Methode, um Sitzungen zu erhalten, funktioniert gut, wenn der Browser keine Cookies unterstützt, aber der Nachteil ist, dass jede URL dynamisch generiert wird, um einer Seite eine Sitzungs-ID zuzuweisen, selbst in einfachen statischen HTML-Seiten.
Neben den oben genannten drei Methoden bietet Servlet auch das HttpSession-Interface, das eine Möglichkeit bietet, Benutzer über mehrere Seitenanfragen oder Website-Besuche hinweg zu erkennen und Informationen über Benutzer zu speichern.
Der Servlet-Container verwendet diesen Interface, um eine Session-Sitzung zwischen einem HTTP-Client und einem HTTP-Server zu erstellen. Die Sitzung dauert einen bestimmten Zeitraum, über mehrere Verbindungen oder Seitenanfragen hinweg.
Sie können durch Aufruf der öffentlichen Methode HttpServletRequest getSession()} um das HttpSession-Objekt zu erhalten, wie folgt:
HttpSession session = request.getSession();
Sie müssen dies aufrufen, bevor Sie jedem Dokumentinhalts an den Client senden. request.getSession().Nachfolgend werden einige wichtige Methoden des HttpSession-Objekts zusammengefasst:
Nummer | Methode & Beschreibung |
---|---|
1 | public Object getAttribute(String name) Diese Methode gibt das Objekt mit dem angegebenen Namen zurück, das in der Session-Session vorhanden ist, oder null, wenn kein solches Objekt vorhanden ist. |
2 | public Enumeration getAttributeNames() Diese Methode gibt ein Enumeration von String-Objekten zurück, die die Namen aller Objekte enthalten, die an die Session-Session gebunden sind. |
3 | public long getCreationTime() Diese Methode gibt die Zeit zurück, zu der die Session-Session erstellt wurde, seit der Greenwich Mean Time. 1970 Jahre 1 Monat 1 Ab Mitternacht des Tages in Millisekunden. |
4 | public String getId() Diese Methode gibt eine Zeichenkette zurück, die die eindeutige Identifikationsnummer der Session-Session enthält. |
5 | public long getLastAccessedTime() Diese Methode gibt die Zeit zurück, die der Client das letzte Mal eine Anfrage gesendet hat, die mit der Session-Session verbunden ist, seit der Greenwich Mean Time. 1970 Jahre 1 Monat 1 Ab Mitternacht des Tages in Millisekunden. |
6 | public int getMaxInactiveInterval() Diese Methode gibt die maximale Zeitintervalle in Sekunden zurück, die der Servlet-Container die Session-Session geöffnet hält, wenn der Client darauf zugreift. |
7 | public void invalidate() Diese Methode markiert die Session-Session als ungültig und löst alle an sie gebundenen Objekte auf. |
8 | public boolean isNew() Wenn der Client noch nicht weiß, dass die Session-Session existiert oder wenn der Kunde sich entscheiden mag, nicht an der Session-Session teilzunehmen, gibt diese Methode true zurück. |
9 | public void removeAttribute(String name) Diese Methode entfernt das Objekt mit dem angegebenen Namen aus der Session-Session. |
10 | public void setAttribute(String name, Object value) Diese Methode bindet ein Objekt mit dem angegebenen Namen an die aktuelle Session-Session. |
11 | public void setMaxInactiveInterval(int interval) Diese Methode legt die Zeit zwischen Clientanfragen in Sekunden fest, bevor der Servlet-Container anweist, dass die Session-Session ungültig ist. |
Dieser Beispiel zeigt, wie man die HttpSession-Objekte verwendet, um die Erstellungszeit und die letzte Zugriffszeit der Session zu erhalten. Wenn keine Session-Sitzung vorhanden ist, wird eine neue Session-Sitzung durch den Request erstellt.
package com.w3codebox.test; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet Implementierungsklasse SessionTrack */ @WebServlet("/SessionTrack) public class SessionTrack extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Wird keine Session-Sitzung vorhanden sein, wird ein neues Session-Objekt erstellt HttpSession session = request.getSession(true); // Erhalten Sie die Erstellungszeit der Session Date createTime = new Date(session.getCreationTime()); // Erhalten Sie das letzte Zugriffsdatum dieser Webseite Date lastAccessTime = new Date(session.getLastAccessedTime()); //Setzen Sie das Format der Datumsausgabe SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String title = "Servlet Session Beispiel - Grundlagen-Tutorial-Website"; Integer visitCount = new Integer(0); String visitCountKey = new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("w3codebox"); if(session.getAttribute(visitCountKey) == null) { session.setAttribute(visitCountKey, new Integer(0)); } // Überprüfen Sie, ob es neue Besucher auf der Webseite gibt if (session.isNew()) { title = "Servlet Session Beispiel - Grundlagen-Tutorial-Website"; session.setAttribute(userIDKey, userID); } else { visitCount = (Integer)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); } session.setAttribute(visitCountKey, visitCount); // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String docType = "<!DOCTYPE html>\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 Informationen</h2>\n" + "<table border=\"1\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + " <th>Session-Informationen</th><th>Wert</th></tr>\n" + "<tr>\n" + " <td>id</td>\n" + " <td>" + session.getId() + "</td></tr>\n" + "<tr>\n" + " <td>Erstellungszeit</td>\n" + " <td>" + df.format(createTime) + " </td></tr>\n" + "<tr>\n" + " <td>Letzte Zugriffszeit</td>\n" + " <td>" + df.format(lastAccessTime) + " </td></tr>\n" + "<tr>\n" + " <td>Benutzer ID</td>\n" + " <td>" + userID + " </td></tr>\n" + "<tr>\n" + " <td>Besuchszählung:</td>\n" + " <td>" + visitCount + "</td></tr>\n" + "</table>\n" + "</body></html>"); } }
Kompilieren Sie den obigen Servlet SessionTrackund erstellen Sie eine geeignete Eintragung in der web.xml-Datei.
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <!-- Klassenname --> <servlet-name>SessionTrack</servlet-name> <!-- im Paket befindlich --> <servlet-class>com.w3codebox.test.SessionTrack</servlet-class> </servlet> <servlet-mapping> <servlet-name>SessionTrack</servlet-name> <!-- Besuchte Website --> <url-pattern>/TomcatTest/SessionTrack</url-pattern> </servlet-mapping> </web-app>
Geben Sie die Adresse in die Adressleiste des Browsers ein http://localhost:8080/TomcatTest/SessionTrackBeim ersten Ausführen wird wie folgt angezeigt:
Versuchen Sie erneut, denselben Servlet auszuführen, es wird wie folgt angezeigt:
Wenn Sie eine Benutzer-Session-Daten abgeschlossen haben, haben Sie folgende Optionen:
Entfernen Sie eine bestimmte Eigenschaft:Sie können public void removeAttribute(String name) Methode, um den Wert, der mit einem bestimmten Schlüssel verknüpft ist, zu löschen.
Die gesamte Session-Sitzung löschen:Sie können public void invalidate() Methode, um die gesamte Session-Sitzung zu verwerfen.
Methode aufrufen, um die Ablaufzeit der Session-Sitzung zu setzen:Sie können public void setMaxInactiveInterval(int interval) Methode, um die Session-Sitzungsablaufzeit einzeln zu setzen.
Abmelden des Benutzers:Wenn Sie Servlet unterstützen 2.4 Servern, können Sie logout um den Client des Web-Servers abzumelden und alle Session-Sitzungen aller Benutzer ungültig zu machen.
web.xml-Konfiguration:Wenn Sie Tomcat verwenden, können Sie zusätzlich zur obigen Methode die Session-Ablaufzeit in der web.xml-Datei konfigurieren, wie folgt:
<session-config> <session-timeout>15</session-timeout> </session-config>
Die Ablaufzeit im obigen Beispiel ist in Minuten angegeben und überschreibt die Standardwerte in Tomcat 30 Minuten Ablaufzeit.
Die Methode getMaxInactiveInterval() in einem Servlet gibt die Ablaufzeit der Session-Sitzung in Sekunden zurück. Daher, wenn die Ablaufzeit der Session-Sitzung in web.xml konfiguriert ist 15 Minuten, dann gibt getMaxInactiveInterval() 900。