1. Eine kurze Einführung in die Sitzung
In der Webentwicklung kann der Server ein Sitzungsobjekt (Sitzungsobjekt) für den Browser jedes Benutzers erstellen. Hinweis: Ein Browser besitzt ausschließlich ein Sitzungsobjekt (standardmäßig). Daher kann das Serverprogramm, wenn es zum Speichern von Benutzerdaten erforderlich ist, Benutzerdaten in eine Sitzung ausschließlich zum Browser des Benutzers schreiben. Wenn der Benutzer den Browser verwendet, um auf andere Programme zuzugreifen, können andere Programme die Daten des Benutzers aus der Sitzung des Benutzers abrufen, um dem Benutzer zu dienen.
2. Die Hauptunterschiede zwischen Sitzung und Cookies
Cookies sind der Browser, der die Daten des Benutzers an Benutzer schreibt.
Die Sitzungstechnologie schreibt Benutzerdaten in benutzerbezogene Sitzungen.
Das Sitzungsobjekt wird vom Server erstellt, und Entwickler können die GetSession -Methode des Anforderungsobjekts aufrufen, um das Sitzungsobjekt zu erhalten.
3. Prinzip der Sitzungsimplementierung
3.1. Wie implementiert ein Server eine Sitzung, um dem Browser eines Benutzers zu dienen?
Nachdem der Server die Sitzung erstellt hat, wird die Sitzungs -ID -Nummer in Form eines Cookies an den Client zurückgeschrieben. Auf diese Weise wird die Sitzungs -ID -Nummer, solange der Browser des Clients nicht geschlossen ist, beim Zugriff auf den Server. Wenn der Server feststellt, dass der Clientbrowser über die Sitzungs -ID verfügt, verwendet er die entsprechende Sitzung im Speicher, um sie zu bedienen. Es kann mit dem folgenden Code nachgewiesen werden:
Paket xdp.gaCl.Session; import Java.io.ioxception; import Javax.servlet.servletException; import Javax.servlet.http.httpServlet; importieren javax.servlet.htttp.httpletRequest; import. javax.servlet.http.HttpSession;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSession;public class SessionDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setcharactercoding ("utf = 8"); Antwort.SetContentType ("text/html; charSet = utf-8"); // Verwenden Sie die GetSession () des Anforderungsobjekts, um die Sitzung zu erhalten. Wenn die Sitzung nicht vorhanden ist, erstellen Sie eine httpSession Session = Request.GetSession (); // die Daten in der Sitzungssitzung speichern. // Erhalten Sie die ID der Sitzungsstring -SessionID = Session.getID (); // Beurteilen Sie, ob die Sitzung neu erstellt wurde, wenn (isNew ()) {response.getWriter (). Print ("Sitzung wurde erfolgreich erstellt, die ID der Sitzung lautet:"+SessionID); } else {response.getWriter (). print ("Die Sitzung ist bereits auf dem Server vorhanden, die ID der Sitzung lautet:"+sessionId); }} public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {dodget (request, response); }}Wenn der Server zum ersten Mal zugreift, erstellt er eine neue Sitzung und sendet die Sitzungs -ID in Form eines Cookies an den Client -Browser, wie in der folgenden Abbildung gezeigt:
Klicken Sie auf die Schaltfläche Aktualisieren und fordern Sie den Server erneut an. Zu diesem Zeitpunkt können Sie feststellen, dass die Sitzungs -ID, die im Cookie gespeichert ist, zusammen an die Serverseite gemeinsam übergeben wird, wie in der folgenden Abbildung angegeben:
Ich denke
// Erhalten Sie die Sitzungs -IDString SessionID = session.getID (); // Speichern Sie die Sitzungs -ID im Cookie mit dem Namen jsessionID Cookie cookie = new Cookie ("JSESSIONID", SessionID); // Legen Sie den gültigen Pfad des Cookie cookie.setPath (Request.getContextPath ()); response.addcookie (Cookie);4. Die Sitzungsverarbeitung nach dem Browser deaktiviert die Cookies
4.1. IE8 deaktivieren Cookies
Tools -> Internetoptionen -> Privatsphäre -> Einstellungen -> Ziehen Sie den Schieberegler nach oben (blockieren Sie alle Cookies).
4.2. Lösung: URL -Umschreiben
Response.Coderedirecturl (Java.lang.String -URL) wird verwendet, um die URL -Adresse nach der SendRedirect -Methode neu zu schreiben.
response.encodeurl (Java.lang.String -URL) wird verwendet, um die URL -Adresse der Formularaktion und des Hyperlinks neu zu schreiben
4.3. Beispiel: Nach dem Deaktivieren von Cookies teilen die Servlets Daten in der Sitzung
Indexservlet
Paket xdp.gacl.Session; import Java.io.ioException; import Java.io.printwriter; import Java.util.linkedHasMap; Import Java.util.map; importieren java.util.set; Importe Javax.ServletException; Imporation Java. javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//Homepage: List all books public class IndexServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse-Antwort) löst ServletException aus, ioException {response.setContentType ("text/html; charSet = utf-8"); Printwriter out = response.getWriter (); // Sitzungsanforderung erstellen.getSession (); out.write ("Diese Website hat die folgenden Bücher: <br/>"); Set <map.Entry <String, Buch >> set = db.getall (). Eintragset (); für (map.entry <string, book> me: set) {book book = me.getValue (); String url = request.getContextPath () + "/servlet/buyServlet? Id =" + book.getId (); //Antwort. Encodeurl (java.lang.String -URL) wird verwendet, um die Formaktion und die URL -Adresse der Hyperlink -URL = Antwort umzuschreiben. // Schreiben Sie die URL -Adresse des Hyperlink out.println (book.getName ()+"<a href = '"+url+"'> kauf </a> <br/>"); }} public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {dodget (request, response); }}/*** @Author GaCl* Simulation der Datenbank*/Klasse DB {private statische Karte <String, Buch> map = new LinkedHashMap <String, Buch> (); static {map.put ("1", neues Buch ("1", "Javaweb Development"); map.put ("2", neues Buch ("2", "Spring Development")); map.put ("3", neues Buch ("3", "Hibernate Development"); map.put ("4", neues Buch ("4", "Struts Development"); map.put ("5", neues Buch ("5", "Ajax Development"); } public static map <String, Buch> getAll () {return map; }} Klassenbuch {private String -ID; privater Zeichenfolge Name; public book () {super (); } public book (String -ID, String -Name) {Super (); this.id = id; this.name = name; } public String getId () {return id; } public void setID (String -ID) {this.id = id; } public String getName () {return name; } public void setName (String -Name) {this.name = name; }}BuyServlet
Paket xdp.gacl.Session; import Java.io.ioxception; import Java.util.ArrayList; Import Java.util.List; Import Javax.Servlet.ServletException; importieren javax.servlet.http.httplet; import Javax.servlet.httpllet.htplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet. javax.servlet.http.httpServletResponse; import Javax.servlet.http.httpSession; Public Class BuyServlet erweitert httpServlet {public void dodget (httpServletrequest request, httpserDespletRespect). Book book = db.getall (). Get (id); // Erhalten Sie das Buch, das der Benutzer httpSession Session = Request.GetSession () kaufen möchte. Liste <Book> list = (list) session.getAttribute ("list"); // den vom Benutzer verwendeten Container zum Speichern aller Bücher erhalten, wenn (list == null) {list = new ArrayList <Book> (); Session.SetAttribute ("Liste", Liste); } list.add (Buch); //Antwort. CODERDIRECTURL (Java.lang.String URL) wird verwendet, um die URL -Adresse nach SendRedirect -Methode -String -URL = Antwort umzuschreiben. System.out.println (URL); Antwort.Sendredirect (URL); } public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {dodget (request, response); }}ListCartServlet
Paket xdp.gaCl.Session; import Java.io.ioxception; import Java.io.printwriter; import Java.util.List; Import Javax.Servlet.ServletException; importieren javax.servlet.http.httplet; import Javax.Servlet.Http. javax.servlet.http.httpServletResponse; importieren javax.servlet.http.httpSession; Public Class ListCartServlet erweitert HttpServlet {public void dodget (httpServletRequest -Anfrage, HttpServletRespectRepuls). Antwort.SetContentType ("text/html; charSet = utf-8"); Printwriter out = response.getWriter (); HttpSession Session = Request.GetSession (); Liste <Book> list = (list) session.getAttribute ("list"); if (list == null || list.size () == 0) {out.write ("Entschuldigung, Sie haben noch keine Produkte gekauft !!"); zurückkehren; } // Zeigen Sie die vom User Out.write erworbenen Produkte ("Sie haben die folgenden Produkte gekauft: <br>"); für (Buchbuch: Liste) {out.write (book.getName () + "<br/>"); }} public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {dodget (request, response); }}Der Betriebseffekt unter IE8 mit deaktivierten Cookies lautet wie folgt:
Demo -Effekt
Wenn Sie sich den von IndexServlet generierten HTML -Code ansehen
// Diese Website enthält die folgenden Bücher: <br/> Javaweb -Entwicklung <a href = '/javaweb_session_study_20140720/servlet/buyServlet; jSessionid = 96bdfb9d87a08d5ab1ea2537cde2db2 <a 1'> 1 '> 1'> 1 '> href = '/javaweb_session_study_20140720/servlet/buyServlet; jsessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2? href = '/javaweb_session_study_20140720/servlet/buyServlet; jsessionId = 96bdfb9d87a08d5ab1eaa2537CDE2DB2? ID = 3'> Kauf </a> <BR/> // Strümpfe Entwicklung <a href = '/javaweb_session_study_20140720/servlet/buyServlet; jSessionID = 96bdfb9d87a08d5ab1eaa2537CDE2DB2? ID = 4'> Kauf </a> <br/> // ajax Development <a href = '/javaweb_session_study_20140720/servlet/buyServlet; jsessionid = 96bdfb9d87a08d5ab1eaa2537cde2db2? ID = 5'> Kauf </a> <br/>
Wenn der Browser Cookies deaktiviert, kann diese Lösung daher mit URLs umschreiben, um das Problem der Sitzungsdatenfreigabe zu lösen. Darüber hinaus Reaktion. Coderedirecturl (Java.lang.String -URL) und Antwort. Encodeurl (Java.lang.String -URL) sind zwei sehr intelligente Methoden. Wenn festgestellt wird, dass der Browser keine Cookies deaktiviert, wird das URL -Umschreiben nicht durchgeführt. Wir greifen unter dem Firefox -Browser zu, ohne Cookies zu deaktivieren. Der Effekt ist wie folgt:
Wie aus der Demonstrationsanimation ersichtlich ist, erstellt der Server beim ersten Zugriff auf den Browser eine Sitzung und sendet dann die ID der Sitzung in Form eines Cookie an den Browser zurück. Die Antwort. Encodeurl (Java.lang.String -URL) -Methode hat auch die URL umgeschrieben. Wenn für den zweiten Besuch die Schaltfläche Aktualisierung geklickt wird, deaktiviert der Firefox -Browser keine Cookies, sodass er den Cookie beim zweiten Besuch bringt. Zu diesem Zeitpunkt kann der Server wissen, dass der aktuelle Client -Browser Cookies nicht deaktiviert und die Antwort benachrichtigt. Encodeurl -Methode (java.lang.String -URL), die die URL nicht umschreiben muss.
5. Der Zeitpunkt, Sitzungsobjekte zu erstellen und zu zerstören
5.1. Die Erstellungszeit des Sitzungsobjekts
Eine neue Sitzung wird erstellt, wenn die Methode der Anforderung. Sie können die ISNew () -Methode verwenden, um festzustellen, ob die Sitzung neu erstellt wurde.
Beispiel: Erstellen Sie eine Sitzung
// Verwenden Sie die GetSession () des Anforderungsobjekts, um die Sitzung zu erhalten. Wenn die Sitzung nicht vorhanden ist, erstellen Sie eine httpSession Session = Request.getSession (); // Erstellen Sie die idstring -Sitzung = session.getID (); // Beurteilen Sie, ob die Sitzung neu erstellt wurde, wenn (isNew ()) {reaktions.getRiter (). Print ("Session erfolgreich erstellt wurde. IS: "+SessionID);}5.2. Zerstörungszeitpunkt des Sitzungsobjekts
Das Sitzungsobjekt wird standardmäßig nicht 30 Minuten lang verwendet, und der Server zerstört automatisch die Sitzung. Die Fehlerzeit der Sitzung kann manuell in der Datei web.xml konfiguriert werden, z. B.:
<? XSI: Schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name> </klag-file-file-file-file-file-file-file> <willkommen> <willkommen> <willkommen <!-Setzen Sie die gültige Zeit der Sitzung: In Minuten-> <Session-Config> <Session-Timeout> 15 </Session-Timeout> </Session-Config> </web-App>
Wenn Sie die Sitzung manuell so einstellen müssen, dass sie im Programm fehlschlagen, können Sie die Sitzung manuell anrufen. Invalidat -Methode, um die Sitzung zu zerstören.
1 httpSession Session = Request.GetSession ();
2 // rufen Sie die Sitzung manuell an. Invalidat -Methode, um die Sitzung zu zerstören
3 Session.invalidate ();
Das obige dreht sich alles um diesen Artikel. Ich hoffe, es wird für alle hilfreich sein, eine Sitzung zu lernen.