1. Una breve introducción a la sesión
En el desarrollo web, el servidor puede crear un objeto de sesión (objeto de sesión) para el navegador de cada usuario. Nota: Un navegador posee exclusivamente un objeto de sesión (por defecto). Por lo tanto, cuando es necesario guardar los datos del usuario, el programa del servidor puede escribir datos del usuario en una sesión exclusiva para el navegador del usuario. Cuando el usuario usa el navegador para acceder a otros programas, otros programas pueden recuperar los datos del usuario de la sesión del usuario para servir al usuario.
2. Las principales diferencias entre la sesión y las cookies
Las cookies son el navegador que escribe los datos del usuario a los usuarios.
Session Technology escribe datos del usuario en sesiones propiedad del usuario.
El servidor crea el objeto de sesión , y los desarrolladores pueden llamar al método de getsession del objeto de solicitud para obtener el objeto de sesión.
3. Principio de implementación de la sesión
3.1. ¿Cómo implementa un servidor una sesión para servir al navegador de un usuario?
Después de que el servidor cree la sesión, volverá a escribir el número de identificación de la sesión al cliente en forma de cookie. De esta manera, mientras el navegador del cliente no esté cerrado, al acceder al servidor, traerá el número de identificación de sesión. Cuando el servidor descubre que el navegador del cliente tiene la ID de sesión, usará la sesión correspondiente en la memoria para servirla. Se puede probar con el siguiente código:
paquete xdp.gacl.session; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRes javax.servlet.http.httpsession; import javax.servlet.http.httpsession; import javax.servlet.http.httpsession; public class sessionDemo1 extiende httpservlet {public void doget (httpservetRequest solicitud, httpservletRetResseponse respuesta) shotss, i -doget (httpservetRequest solicitud, htttpserveStletResponse Respuesta). respuesta.setcharacterEncoding ("utf = 8"); respuesta.setContentType ("text/html; charset = utf-8"); // usa el objeto getSession () del objeto de solicitud para obtener la sesión. Si la sesión no existe, cree una sesión httpsession = request.getSession (); // almacenar los datos en la sesión Session.SetAttribute ("Datos", "Lonely CANGLANG"); // Obtener la ID de la Session String SessionId = session.getId (); // juzga si la sesión se crea recientemente if (session.isNew ()) {Response.getWriter (). Impresa ("La sesión se creó con éxito, la ID de la sesión es:"+SessionId); } else {Response.getWriter (). imprime ("La sesión ya existe en el servidor, la identificación de la sesión es:"+sessionId); }} public void dopost (httpservletRequest solicitud, respuesta httpservletResponse) arroja servletException, ioexception {doget (solicitud, respuesta); }}Al acceder por primera vez, el servidor creará una nueva sesión y enviará la ID de sesión al navegador del cliente en forma de cookie, como se muestra en la figura a continuación:
Haga clic en el botón Actualizar y solicite el servidor nuevamente. En este momento, puede ver que cuando el navegador solicite nuevamente el servidor, la ID de sesión almacenada en la cookie se pasará juntas al lado del servidor, como se muestra en la figura a continuación:
Supongo que el método request.getSession () debe haber realizado el siguiente procesamiento después de la sesión recién creada dentro
// Obtenga la sesión IdString sessionID = session.getId (); // almacenamiento de la ID de sesión en la cookie con el nombre JSessionID Cookie Cookie = New Cookie ("JSessionID", SessionId); // Establezca la ruta válida de la cookie.setPath (request.getContextPath ()); Response.AddCookie (Cookie);4. El procesamiento de la sesión después del navegador deshabilita las cookies
4.1. IE8 Desactivar cookies
Herramientas -> Opciones de Internet -> Privacidad -> Configuración -> Tire del control deslizante a la parte superior (bloquear todas las cookies)
4.2. Solución: URL Reescritura
Respuesta.CoderedIrecturl (Java.lang.String URL) se usa para reescribir la dirección de URL después del método Sendedirect.
Respuesta.Encodeurl (java.lang.String URL) se usa para reescribir la dirección de URL de la acción de formulario y el hipervínculo
4.3. Ejemplo: después de deshabilitar las cookies, los servlets comparten datos en la sesión
Indicador
paquete xdp.gacl.session; import java.io.ioException; import java.io.printwriter; import java.util.linkedhashmap; import java.util.map; import java.util.set; import javax.servlet.servletException; import javax.servlet.http.httservlet; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; // HomePage: Lista de todos los libros El índice de clases se extiende httpservlet {public void doget (homEntpSerServe Solicitud, la lista de clases publicitaria, la lista de clases publicitaria, se extiende httpservlet {public void doget (hetTserveServ. HttpServletResponse Respuesta) lanza ServletException, ioException {Response.SetContentType ("Text/Html; Charset = UTF-8"); PrintWriter out = Response.getWriter (); // Crear sesión de sesión.getSession (); out.write ("Este sitio web tiene los siguientes libros: <br/>"); Set <map.entry <string, book >> set = db.getall (). EntrySet (); para (map.entry <string, book> me: set) {book book = me.getValue (); String url = request.getContextPath () + "/servlet/buyservlet? Id =" + book.getID (); //respuesta. EncodeUrl (java.lang.String URL) se usa para reescribir la acción de formulario y la dirección de URL de la url de hipervínculo = respuesta.EncodeUrl (url); // Reescribe la dirección de URL de Hyperlink out.println (book.getName ()+"<a href = '"+url+"'> compra </a> <br/>"); }} public void dopost (httpservletRequest solicitud, respuesta httpservletResponse) arroja servletException, ioexception {doget (solicitud, respuesta); }}/*** @author gacl* simular la base de datos*/class db {private static map <string, book> map = new LinkedHashMap <String, Book> (); static {map.put ("1", nuevo libro ("1", "Desarrollo Javaweb")); map.put ("2", nuevo libro ("2", "Desarrollo de primavera")); map.put ("3", nuevo libro ("3", "Desarrollo Hibernado")); map.put ("4", nuevo libro ("4", "Desarrollo de Struts"); map.put ("5", nuevo libro ("5", "Desarrollo de Ajax")); } public static map <string, book> getAll () {return map; }} Libro de clase {ID de cadena privada; nombre de cadena privada; libro público () {super (); } Libro público (ID de cadena, nombre de cadena) {super (); this.id = id; this.name = name; } public String getId () {return id; } public void setid (ID de cadena) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; }}Buyservlet
paquete xdp.gacl.session; import java.io.ioException; import java.util.arrayList; import java.util.list; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httservletRequest; importar; javax.servlet.http.httpServletResponse; import javax.servlet.http.httpsession; public class BuyServlet extiende httpservlet {public void doget (httpservletRequest request, httpServletResponse respuesta) tira servletexception, iOexception {string Id = request.getArtest Soly, httpServletResponse Response) tira servicción, iOException {String Id = request.getArtest Soly, httpServletResponse Response) ServletException, iOException {String Id = request.getTequest Solicitue Libro book = db.getall (). Get (id); // Obtenga el libro que el usuario desea comprar session httpsession = request.getSession (); List <Book> list = (list) session.getAttribute ("List"); // Obtenga el contenedor utilizado por el usuario para guardar todos los libros si (list == null) {list = new ArrayList <Book> (); session.SetAttribute ("List", List); } list.add (libro); //respuesta. EncodeDirecturl (java.lang.string url) se usa para reescribir la dirección de URL después del método sendedirect string url = respuesta.encoderedirecturl (request.getContextPath ()+"/servlet/listcartservlet"); System.out.println (URL); respuesta.sendedirect (URL); } public void dopost (httpservletRequest solicitud, respuesta httpservletreSponse) lanza ServletException, ioexception {doget (solicitud, respuesta); }}Listcartservlet
paquete xdp.gacl.session; import java.io.ioException; import java.io.printwriter; import java.util.list; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; import javax.servlet.http.httpsession; public class ListCartServlet extiende httpservlet {public void doget (httpservletRequest, solicitud, respuesta httpServletResponse) lanzada por servicio de servicio, iOexception { respuesta.setContentType ("text/html; charset = utf-8"); PrintWriter out = Response.getWriter (); Httpsession session = request.getSession (); List <Book> list = (list) session.getAttribute ("List"); if (list == null || list.size () == 0) {out.write ("Lo siento, ¡aún no has comprado ningún producto!"); devolver; } // Muestre los productos comprados por el usuario out.write ("Has comprado los siguientes productos: <br>"); para (libro de libros: list) {out.write (book.getName () + "<br/>"); }} public void dopost (httpservletRequest solicitud, respuesta httpservletResponse) arroja servletException, ioexception {doget (solicitud, respuesta); }}El efecto de operación en IE8 con cookies deshabilitados es el siguiente:
Efecto de demostración
Al observar el código HTML generado por IndexServlet, puede ver que cada hipervínculo tiene el ID de sesión seguido de, como se muestra a continuación
// Este sitio web tiene los siguientes libros: <br/> Desarrollo de Javaweb <a href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionID = 96bdfb9d87a08d5ab1eaa2537cde2db2? Id = 1'> compra </a> </> ///////////entabal href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionID = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 2'> compra </a> <br/> // desarrollo de hibernidades <a href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionID = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 3'> compra </a> <br/> // Desarrollo de los puntos <a href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionID = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 4'> compra </a> <br/> // ajax desarrollo <a href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionID = 96bdfb9d87a08d5ab1eaa2537cde2db2? id = 5'> compra </a> <br/>
Por lo tanto, cuando el navegador deshabilita las cookies, puede reescribir esta solución con URL para resolver el problema de intercambio de datos de la sesión. Además, respuesta. EncoderDirecturl (Java.lang.String URL) y respuesta. EncodeURL (Java.lang.String URL) son dos métodos muy inteligentes. Cuando se detecta que el navegador no deshabilita las cookies, la reescritura de URL no se realizará. Accedemos a él bajo el navegador Firefox sin deshabilitar las cookies, el efecto es el siguiente:
Como se puede ver en la animación de demostración, cuando el navegador accede primero, el servidor crea una sesión y luego envía la identificación de la sesión al navegador en forma de cookie. La respuesta. CodeURL (Java.lang.String URL) también reescribió la URL. Cuando se hace clic en el botón de actualización para la segunda visita, el navegador Firefox no deshabilita las cookies, por lo que trae la galleta en la segunda visita. En este momento, el servidor puede saber que el navegador de cliente actual no deshabilita las cookies, por lo que notifica la respuesta. Método EncodeUrl (Java.lang.String URL) que no necesita reescribir la URL.
5. El momento de crear y destruir objetos de sesión
5.1. El tiempo de creación del objeto de sesión
Se creará una nueva sesión cuando se solicite el método request.getSession () por primera vez en el programa. Puede usar el método ISNEW () para determinar si la sesión está recientemente creada.
Ejemplo: crear una sesión
// usa el objeto getSession () del objeto de solicitud para obtener la sesión. Si la sesión no existe, cree una sesión httpsession = request.getSession (); // Obtenga el IdString sessionId = session.getId (); // juzga si la sesión es recientemente creada if (session.isNew ()) {Response.getWriter (). Impresión ("La sesión se creó con éxito, la ID de la sesión es:"+SessionId);} else {Respuesta es: "+sessionId);}5.2. Tiempo de destrucción del objeto de sesión
El objeto de sesión no se usa durante 30 minutos de forma predeterminada, y el servidor destruirá automáticamente la sesión. El tiempo de falla de la sesión se puede configurar manualmente en el archivo web.xml, por ejemplo:
<? xml versión = "1.0" encoding = "utf-8"?> <web-app versión = "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"> <psiplip-name> </plawing-name> <bequey-file-list> <cile> <
Cuando necesite establecer manualmente la sesión para fallar en el programa, puede llamar manualmente la sesión. Invalidar el método para destruir la sesión.
1 sesion httpsession = request.getSession ();
2 // llame manualmente la sesión. Invalidar el método para destruir la sesión
3 session.invalidate ();
Lo anterior se trata de este artículo, espero que sea útil para todos aprender una sesión.