JSP Sitzung
HTTP ist ein zustandsloses Protokoll, was bedeutet, dass jedes Mal, wenn ein Client eine Webseite abruft, eine separate Serververbindung geöffnet wird, sodass der Server keine Informationen aus früheren Client-Anfragen speichert.
Es gibt drei Möglichkeiten, eine Sitzung zwischen Client und Server aufrechtzuerhalten:
Cookies
Der Webserver kann eine eindeutige Sitzungs-ID als Cookie zuweisen, um jeden Client zu repräsentieren, und sie verwenden, um die nachfolgenden Anfragen dieses Clients zu identifizieren.
Dies ist möglicherweise keine effektive Methode, denn in vielen Fällen unterstützen Browser Cookies nicht unbedingt, daher empfehlen wir nicht, diese Methode zur Aufrechterhaltung von Sitzungen zu verwenden.
Versteckte Formularfelder
Ein Webserver kann ein verstecktes HTML-Formularfeld zusammen mit einer eindeutigen Sitzungs-ID senden, etwa so:
<input type="hidden" name="sessionid" value="12345">
Dieser Eintrag bedeutet, dass beim Absenden des Formulars der angegebene Name und Wert automatisch in die GET- oder POST-Daten aufgenommen werden. Immer wenn der Browser eine Anfrage sendet, kann der Wert von session_id verwendet werden, um verschiedene Browser zu verfolgen.
Diese Methode kann effektiv sein, aber das Anklicken von Hyperlinks in <A HREF>-Tags erzeugt keine Formularübermittlungsereignisse, daher unterstützen versteckte Formularfelder auch keine allgemeine Sitzungsverfolgung.
URL-Umschreibung
Sie können zusätzliche Daten an jede URL anhängen, um Sitzungen zu unterscheiden, und der Server kann anhand dieser Daten Sitzungsbezeichner zuordnen.
Zum Beispiel, http://w3cschool.cc/file.htm;sessionid=12345, die Sitzungskennung ist sessionid=12345, und der Server kann diese Daten verwenden, um den Client zu identifizieren.
Im Gegensatz dazu ist URL-Rewriting ein besserer Weg, da es auch funktioniert, wenn der Browser keine Cookies unterstützt, aber der Nachteil ist, dass Sie die Session-ID für jede URL dynamisch angeben müssen, selbst für eine einfache HTML-Seite.
Session-Objekt
Zusätzlich zu den oben genannten Methoden verwendet JSP die von Servlets bereitgestellte HttpSession-Schnittstelle, um einen Benutzer zu identifizieren und alle Zugriffsinformationen für diesen Benutzer zu speichern.
Standardmäßig aktiviert JSP die Sitzungsverfolgung, und für neue Clients wird automatisch ein neues HttpSession-Objekt instanziiert. Um die Sitzungsverfolgung zu deaktivieren, müssen Sie sie explizit deaktivieren, indem Sie das session-Attribut in der page-Direktive auf false setzen, wie folgt:
<%@ page session="false" %>
Die JSP-Engine stellt Entwicklern das implizite session-Objekt zur Verfügung. Mit dem bereitgestellten session-Objekt können Entwickler bequem Daten speichern oder abrufen.
Die folgende Tabelle listet einige wichtige Methoden des session-Objekts auf:
| S.N. | Methode & Beschreibung |
|---|---|
| 1 | public Object getAttribute(String name) |
JSP-Sitzungsanwendung
Dieses Beispiel beschreibt, wie Sie das HttpSession-Objekt verwenden, um die Erstellungszeit und die letzte Zugriffszeit abzurufen. Wir ordnen dem Request-Objekt ein neues Sitzungsobjekt zu, falls es noch nicht vorhanden ist.
<%@ 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>
Versuchen Sie,http://localhost:8080/testjsp/main.jspzu besuchen, der erste Durchlauf erzeugt das folgende Ergebnis:
Ein erneuter Besuch erzeugt das folgende Ergebnis:
Sitzungsdaten löschen
Nach der Verarbeitung der Sitzungsdaten eines Benutzers haben Sie die folgenden Optionen:
- Ein bestimmtes Attribut entfernen:
Rufen Sie die Methode public void removeAttribute(String name) auf, um das angegebene Attribut zu entfernen.
- Die gesamte Sitzung löschen:
Rufen Sie die Methode public void invalidate() auf, um die gesamte Sitzung ungültig zu machen.
- Sitzungs-Timeout festlegen:
Rufen Sie die Methode public void setMaxInactiveInterval(int interval) auf, um das Sitzungs-Timeout festzulegen.
- Den Benutzer abmelden:
Bei Servern, die Servlet 2.4 unterstützen, können Sie die Methode logout() aufrufen, um den Benutzer abzumelden und alle zugehörigen Sitzungen ungültig zu machen.
- Die web.xml-Datei konfigurieren:
Wenn Sie Tomcat verwenden, können Sie die web.xml-Datei wie folgt konfigurieren:
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Das Timeout wird in Minuten angegeben, und das Standard-Timeout in Tomcat beträgt 30 Minuten.
Die Methode getMaxInactiveInterval() in Servlet gibt das Timeout in Sekunden zurück. Wenn 15 Minuten in web.xml konfiguriert sind, gibt die Methode getMaxInactiveInterval() 900 zurück.
Weitere Erweiterungen