1. Une brève introduction à la session
Dans le développement Web, le serveur peut créer un objet de session (objet de session) pour le navigateur de chaque utilisateur. Remarque: un navigateur possède exclusivement un objet de session (par défaut). Par conséquent, lorsqu'il est nécessaire d'enregistrer les données de l'utilisateur, le programme du serveur peut rédiger des données utilisateur dans une session exclusive au navigateur de l'utilisateur. Lorsque l'utilisateur utilise le navigateur pour accéder à d'autres programmes, d'autres programmes peuvent récupérer les données de l'utilisateur de la session de l'utilisateur pour servir l'utilisateur.
2. Les principales différences entre la session et les cookies
Les cookies sont le navigateur qui écrit les données de l'utilisateur aux utilisateurs.
La technologie de session écrit des données utilisateur dans les sessions appartenant à des utilisateurs.
L'objet de session est créé par le serveur et les développeurs peuvent appeler la méthode Getession de l'objet de demande pour obtenir l'objet de session.
3. Principe de mise en œuvre de la session
3.1. Comment un serveur implémente-t-il une session pour servir le navigateur d'un utilisateur?
Une fois que le serveur a créé la session, il réécrira le numéro d'identification de la session au client sous la forme d'un cookie. De cette façon, tant que le navigateur du client n'est pas fermé, lors de l'accès au serveur, il apportera le numéro d'identification de session. Lorsque le serveur constate que le navigateur client a l'ID de session, il utilisera la session correspondante en mémoire pour le servir. Il peut être prouvé avec le code suivant:
Package xdp.gacl.sse; Importer java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import; javax.servlet.http.httpSession; import javax.servlet.http.httpSession; import javax.servlet.http.httpcession; public class SessionDemo1 étend httpservlet {public Void doget (httpsservlerest request, httpleserv. Response.SetcharAtterencoding ("UTF = 8"); Response.SetContentType ("Text / HTML; charSet = UTF-8"); // Utilisez le getSession () de l'objet de demande pour obtenir la session. Si la session n'existe pas, créez une session httpSession = request.getSession (); // Stockage les données dans la session Session.SetAttribute ("Data", "Lonely CanGlang"); // Obtenez l'ID de la chaîne de session sessionID = session.getID (); // juger si la session est nouvellement créée if (session.isnew ()) {réponse.getWriter (). Print ("La session a été créée avec succès, l'ID de la session est:" + sessionID); } else {réponse.getWriter (). print ("La session existe déjà dans le serveur, l'ID de la session est:" + sessionId); }} public void doPost (httpsservletRequest request, httpservletResponse réponse) lève ServletException, ioException {doGet (request, réponse); }}Lors de l'accès pour la première fois, le serveur créera une nouvelle session et enverra l'ID de session au navigateur client sous la forme d'un cookie, comme indiqué sur la figure ci-dessous:
Cliquez sur le bouton Actualiser et demandez à nouveau le serveur. À l'heure actuelle, vous pouvez voir que lorsque le navigateur demande à nouveau le serveur, l'ID de session stocké dans le cookie sera transmis au côté du serveur, comme indiqué dans la figure ci-dessous:
Je suppose que la méthode request.getSession () doit avoir fait le traitement suivant après la session nouvellement créée à l'intérieur
// Obtenez la session idstring sessionID = session.getId (); // Stockage l'ID de session dans le cookie avec le nom jSessionId Cookie cookie = new cookie ("jSessionId", sessionID); // définit le chemin valide du cookie cookie.setPath (request.getContextPath ()); réponse.addcookie (cookie);4. Le traitement de la session après le navigateur désactive les cookies
4.1. IE8 Désactiver les cookies
Outils -> Options Internet -> Confidentialité -> Paramètres -> Tirez le curseur en haut (bloquez tous les cookies)
4.2. Solution: réécriture d'URL
Response.EncoderedirectUrl (java.lang.string URL) est utilisé pour réécrire l'adresse URL après la méthode SendreDirect.
Response.encodeurl (java.lang.string URL) est utilisé pour réécrire l'adresse URL de l'action de la forme et de l'hyperlien
4.3. Exemple: Après avoir désactivé les cookies, les servlets partagent des données dans la session
IndexServlet
Package xdp.gacl.session; Importer java.io.ioException; import java.io.printwriter; import java.util.linkedhashmap; import java.util.map; import java.util.set; import javax.servlet.servlexception; import javax.servlet.http.httvlet; import; Javax.servlet.http.httpservletRequest; Importer Javax.servlet.http.httpservletRequest; Importer Javax.servlet.http.httpservReSpenser; // homepage: Liste tous les livres de classe publique IndexServlet étend Httpservlet {public Void Doget (Httpservlet HttpServletResponse Response) lève Servlexception, ioException {réponse.setContentType ("text / html; charset = utf-8"); Printwriter out = réponse.getWriter (); // Créer une session request.getSession (); out.write ("Ce site Web a les livres suivants: <br/>"); Set <map.entry <string, book >> set = db.getall (). Entryset (); for (map.entry <string, book> me: set) {book book = me.getValue (); String url = request.getContextPath () + "/ servlet / buyservlet? Id =" + book.getId (); //réponse. Encodeurl (java.lang.string URL) est utilisé pour réécrire l'action de formulaire et l'adresse URL de l'URL de l'hyperlien = réponse.encodeurl (URL); // réécriture de l'adresse URL de l'hyperlien out.println (book.getName () + "<a href = '" + url + "'> acheter </a> <br/>"); }} public void doPost (httpsservletRequest request, httpservletResponse réponse) lève ServletException, ioException {doGet (request, réponse); }} / ** * @author gacl * simule database * / class db {private static map <string, book> map = new LinkedHashmap <string, book> (); statique {map.put ("1", nouveau livre ("1", "développement javaweb")); map.put ("2", nouveau livre ("2", "Spring Development")); map.put ("3", nouveau livre ("3", "Hibernate Development")); map.put ("4", nouveau livre ("4", "Struts Development")); map.put ("5", nouveau livre ("5", "Ajax Development")); } Map statique publique <String, book> getAll () {return map; }} classe de classe {ID de chaîne privée; nom de chaîne privé; livre public () {super (); } livre public (String id, nom de chaîne) {super (); this.id = id; this.name = name; } public String getID () {return id; } public void setid (String id) {this.id = id; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; }}Buyservlet
Package XDP.GACL.SESSION; IMPORT Java.io.ioException; Importer Java.util.ArrayList; Importer Java.util.List; Importer Javax.servlet.servletException; Importer Javax.Servlet.http.httSservlet; Importer Javax.servlet.http.http.httirtleTrETRe Javax.servlet.http.httpservletResponse; Importer Javax.servlet.http.httpSession; Public Class buyservlet étend httpservlet {public void Doget (httpServletRequest request, httpservletReSpense Réponse) Lisclexect, ioException {String id = request. Livre de livres = db.getall (). Get (id); // Obtenez le livre que l'utilisateur souhaite acheter httpSession Session = request.getSession (); List <book> list = (list) session.getAttribute ("list"); // Obtenez le conteneur utilisé par l'utilisateur pour enregistrer tous les livres if (list == null) {list = new ArrayList <Book> (); session.setAttribute ("list", liste); } list.add (livre); //réponse. EncodeRedirectUrl (java.lang.string URL) est utilisé pour réécrire l'adresse URL après la méthode SenDredirect URL = Response.EncoderedirectUrl (request.getContextPath () + "/ servlet / listCartservlet"); System.out.println (URL); réponse.SendRedirect (URL); } public void doPost (requête HttpServletRequest, réponse httpservletResponse) lève ServletException, ioException {doget (request, réponse); }}ListCartServlet
package xdp.gacl.session; importer java.io.ioexception; import java.io.printwriter; import java.util.list; import javax.servlet.servletException; import javax.servlet.http.httvlett; Javax.servlet.http.httpservletResponse; Importer javax.servlet.http.httpSession; classe publique ListCartServlet étend httpservlet {public void Doget (httpServletRequest request, httpservletResponse réponse) lance le Servicexect, ioexception { Response.SetContentType ("Text / HTML; charSet = UTF-8"); Printwriter out = réponse.getWriter (); HttpSession session = request.getSession (); List <book> list = (list) session.getAttribute ("list"); if (list == null || list.size () == 0) {out.write ("Désolé, vous n'avez pas encore acheté de produits !!"); retour; } // Afficher les produits achetés par l'utilisateur Out.Write ("Vous avez acheté les produits suivants: <br>"); pour (livre de livre: liste) {out.write (book.getName () + "<br/>"); }} public void doPost (httpsservletRequest request, httpservletResponse réponse) lève ServletException, ioException {doGet (request, réponse); }}L'effet de fonctionnement sous IE8 avec les cookies désactivés est le suivant:
Effet de démonstration
En regardant le code HTML généré par indexServlet, vous pouvez voir que chaque hyperlien a l'identifiant de session suivi, comme indiqué ci-dessous
// Ce site Web a les livres suivants: <br/> Javaweb Development <a href = '/ javaweb_session_study_20140720 / servlet / buyservlet; jSessionID = 96BDFB9D87A08D5AB1EAA2537CDE2DB2? Id = 1'> Achat </a> href = '/ javaweb_session_study_20140720 / servlet / buyservlet; jSessionId = 96bdfb9d87a08d5ab1eaaa2537cde2db2? Id = 2'> acheter </a> <br/> // hierned Development <a a a href = '/ javaweb_session_study_20140720 / servlet / buyservlet; jSessionId = 96bdfb9d87a08d5ab1eaaa2537cde2db2? id = 3'> acheter </a> <br/> // Struts Development <a a href = '/ javaweb_session_study_20140720 / servlet / buyservlet; jSessionId = 96bdfb9d87a08d5ab1eaaa2537cde2db2? id = 4'> Achat </a> <br/> // ajax Development <a a a href = '/ javaweb_session_study_20140720 / servlet / buyservlet; jSessionId = 96bdfb9d87a08d5ab1eaaa2537cde2db2? id = 5'> acheter </a> <br/>
Par conséquent, lorsque le navigateur désactive les cookies, il peut réécrire cette solution avec des URL pour résoudre le problème de partage de données de session. De plus, la réponse. EncoderedirectUrl (java.lang.string URL) et réponse. Encodeurl (java.lang.string URL) sont deux méthodes très intelligentes. Lorsqu'il est détecté que le navigateur ne désactive pas les cookies, la réécriture de l'URL ne sera pas effectuée. Nous y accédons sous le navigateur Firefox sans désactiver les cookies, l'effet est le suivant:
Comme on peut le voir dans l'animation de démonstration, lorsque le navigateur accède à la première fois, le serveur crée une session, puis renvoie l'ID de la session au navigateur sous la forme d'un cookie. La réponse. La méthode Encodeurl (java.lang.string) a également réécrit l'URL. Lorsque le bouton d'actualisation est cliqué pour la deuxième visite, le navigateur Firefox ne désactive pas les cookies, il apporte donc le cookie lors de la deuxième visite. À l'heure actuelle, le serveur peut savoir que le navigateur client actuel ne désactive pas les cookies, donc il informe la réponse. Méthode EncodeUrl (java.lang.string) qui n'a pas besoin de réécrire l'URL.
5. Le moment de la création et de la destruction d'objets de session
5.1. L'heure de création de l'objet de session
Une nouvelle session sera créée lorsque la méthode request.getSession () sera appelée pour la première fois dans le programme. Vous pouvez utiliser la méthode isnew () pour déterminer si la session est nouvellement créée.
Exemple: créer une session
// Utilisez le getSession () de l'objet de demande pour obtenir la session. Si la session n'existe pas, créez une session httpSession = request.getSession (); // Obtenez le SessionID IDString = session.getID (); // jugez si la session est créée si (session.isnew ()) {Response.getWriter (). Print ("Session a été créée avec succès, l'identifiant de la session est:" + sessiond);} else {Response.getwriter (). est: "+ sessionid);}5.2. Durée de destruction de l'objet de session
L'objet de session n'est pas utilisé pendant 30 minutes par défaut et le serveur détruira automatiquement la session. Le temps de défaillance de la session peut être configuré manuellement dans le fichier web.xml, par exemple:
<? xml version = "1.0" encoding = "utf-8"?> <web-app version = "2.5" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema instance" XSI: ScheMalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <plawing-name> </splay-name> </vendule-list> <bienvenue> index.jsp </calent> <! - Définissez le temps valide de la session: en minutes -> <session-config> <session-timeout> 15 </ession-timeout> </ session-config> </ web -pp>
Lorsque vous devez définir manuellement la session pour échouer dans le programme, vous pouvez appeler manuellement la méthode Session.invalidate pour détruire la session.
1 HttpSession Session = request.getSession ();
2 // Appelez manuellement la méthode Session.invalidate pour détruire la session
3 session.invalidate ();
Ce qui précède est tout sur cet article, j'espère qu'il sera utile pour tout le monde d'apprendre la session.