English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Introducción a la sesión
La sesión se refiere al proceso de interacción entre el usuario y la aplicación web durante un período de tiempo.
La sesión (Session) se utiliza generalmente para rastrear el estado del usuario, almacenar información del usuario en el proceso del navegador.
Cuando el usuario cierra el navegador, la última sesión ya no se puede obtener nuevamente (el maxAge del Cookie es-1En el caso). Al abrir un nuevo navegador, se iniciará una nueva sesión.
La clase javax.servlet.http.HttpSession. Cada HttpSession representa una sesión de usuario.
El tiempo de expiración predeterminado de cada sesión es30 minutos.
Cuando el navegador visita el servidor por primera vez, independientemente de qué página visite primero, el servidor asigna a los usuarios un identificador de sesión único, es decir, jsessionid, y lo devuelve al usuario en forma de cookie.
La siguiente imagen es una cabecera de respuesta (la siguiente imagen se basa en Servlet3.0 en Servlet2.5No tiene la propiedad HttpOnly)
El servidor crea una sesión para cada usuario, es decir, un objeto HttpSession, que se almacena en el lado del servidor.
Entonces, ¿cómo sabe el servidor si el usuario que vuelve a visitar es el mismo?
Cuando el navegador vuelve a visitar el servidor, lleva un cookie que contiene jsessionid para acceder al servidor. El servidor devuelve el objeto HttpSession de este usuario según este id, lo que mantiene la sesión.
(¿Entonces, ¿es posible implementar la misma sesión en diferentes navegadores?)
A continuación, se muestra una URL típica que tiene un cierto efecto de engaño y puede implementar la misma sesión en diferentes navegadores:
http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C )
La relación entre el navegador y el servidor se muestra en las siguientes dos figuras:
HttpSession:
En Servlet, se obtiene el objeto sesión a través del método HttpServletRequest.getSession().
Las siguientes métodos de la interfaz HttpSession se utilizan para compartir datos en el ámbito de la sesión:
getAttribute(“name”) setAttribute(“name”,object); getAttributeNames(); removeAttrubute(“name”)
Invalidate(); - Este método elimina fuertemente la sesión almacenada en el caché del servidor.
Ejemplo:
En un Servlet, establecer ciertos valores en httpSession utilizando setAttribute.
Saltar a otros servlets a través de hiperenlaces u otros métodos y mostrar información mediante getAttribute.
Mostrar información llamando a getAttribute en cualquier Servlet.
Cierre este navegador, acceda de nuevo al servlet que obtuvo la información y verá que ya no hay información.
Como se muestra a continuación:
String name=request.getParameter("name"); request.setAttribute("name", "request---"+name); request.getSession().setAttribute("name", "session---"+name); getServletContext().setAttribute("name", "application---"+name);
La identificación única de Session es Id:
Cada sesión tiene una identificación única, es decir, el ID.
Cuando el navegador obtiene una nueva sesión, el usuario puede usar session.geId() para imprimir el valor del ID.
Al saltar entre múltiples páginas sin cerrar el navegador, se utiliza la misma sesión.
Por ejemplo:
request.getSession().getId();
¿Qué es la salida segura?:
Cuando el usuario sale, debe limpiar su información de la sesión, es decir, salir de manera segura.
La salida segura es para limpiar completamente la información dejada en el servidor para evitar ser atacado por piratas informáticos
Session.invalidate();
1、request.getSession().invalidate();
De esta manera, se puede eliminar el objeto correspondiente en la piscina de sesión.
2、Session.removeAttribute(…)
Por ejemplo:
request.getSession().removeAttribute("realCode");
Se utiliza para eliminar las propiedades del objeto session
Seguimiento de sesión a través de la reescritura de URL:
Ya se ha dicho anteriormente, el contenedor de Servlet primero guarda un SessionID en el cliente, y luego, cuando el navegador envía una solicitud HTTP, siempre contiene este SessionID. El contenedor de Servlet lee este SessionID en la solicitud HTTP, según este SessionID extrae el objeto HttpSession del contenedor, para poder rastrear a qué sesión pertenece la solicitud HTTP, este proceso se llama seguimiento de sesión.
如果浏览器支持Cookie,Servlet容器就将SessionID作为Cookie保存在浏览器的客户端。但如果出于安全的考虑,用户禁用了Cookie,那么Servlet容器又如何来跟踪会话呢?
首先让我们在IE中禁用Cookie(注意:对于某些GHOST的系统不起作用)。
IE>工具>Internet选项>隐私>高级,然后禁用Cookie:
我们可以在主页加上这样的超链接:(与下面代码中相关的SaveServlet.java GetServlet.java LogoutServlet.java的代码我放在最后面贴)
<h2>演示重写url技术---破解用户禁用cookie之后,我们session无效的问题</h2> <form action="<%=response.encodeURL("saveServlet") %>" method="post"> name:<input type="text" name="name"/><br/> <input type="submit"/> </form> <a href="<%=response.encodeURL("getServlet") %>">重写url-读取几个容器中的数据</a><br/> <a href="<%=response.encodeURL("logoutServlet") %>">重写url-安全退出</a>
这句<form action=“<%=response.encodeURL(“/aa”)%>”>就可以实现这一功能
在这里禁用了cookie之后,浏览器仍然能够接收服务器发送过来的cookie,但是浏览器只能接受不能发送给服务器,不能发送cookie的话也就不能去session池中去取相应的对象了。
在表单中输入想要的值之后,再到下面的getServlet这里的超链接处访问看是否仍然能够显示出输入的值,答案是肯定的。这里的访问路径就相当于类似
http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C 的,后面带的jsessionid=F8692D61CD46D094DBB7A8FC7387649C就是其id,如此,你到另一个浏览器中去输入这个网址也能够访问到。
这里我要补充一下:(以下情况是在我将session池中HttpSession对象对应的session的JSESSIONID值和value值写入cookie中,这个cookie会覆盖系统生成的那个,就相当于是我自己生成的,我将存在时间设置成了十分钟,如果不覆盖的话,cookie在浏览器关闭时就会消失,下面的现象也就不会出现了)
在是否禁用cookie这两种情况下,在session池中新建的对象的id是不一样的,即假如你在禁用了cookie时在表单中输入了一个name的值,查询结果如下:
并且jsessionid为2BB51EBDEAAF14D19656C71E1B6F9FF6
然后立即切换到不禁用cookie模式,输入另一个名字如Tom,查询结果自然会是两个Tom,jsessionid为
203F9E4DB5D874476B81DAF350661B6A,与禁用不同,这就导致了以下结果的出现
然后此时我们将浏览器关闭,再次进入浏览器,在不禁用cookie模式下查看访问结果,如下:
下面我将主要的代码贴上来:
SaveServlet.java
paquete cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SaveServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) lanza ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) lanza ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); request.setCharacterEncoding("utf-8"); String name=request.getParameter("name"); request.setAttribute("name", "request---"+name); request.getSession().setAttribute("name", "session---"+name); getServletContext().setAttribute("name", "application---"+name); //将cookie技术和session技术联合起来应用的一个示例---※功能:使用户在关闭浏览器之后,如果10minutos dentro de los cuales pueden ingresar al sitio y acceder a la información de la sesión //Escribir en el cliente un cookie con clave "JSESSIONID" y valor "sessionid", Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); c.setMaxAge(60*10);//Este fenómeno se debe a esta línea, sin esta línea no habría el fenómeno mencionado anteriormente c.setPath(request.getContextPath()); response.addCookie(c); out.println("Guardado exitoso..."); out.flush(); out.close(); } }
GetServlet.java
paquete cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GetServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) lanza ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \-//W3C//DTD HTML 4.01 Transicional//DOCTYPE HTML PUBLIC ", out.println("<HTML>"); out.println(" <CABECERA><TITULO>Un Servlet</TITULO></CABECERA>"); out.println(" <CUERPO>"); String reqName=(String) request.getAttribute("name"); String seName=(String) request.getSession().getAttribute("name"); String appName=(String) getServletContext().getAttribute("name"); out.println(reqName+"<br/>"); out.println(seName+"<br/>"); out.println(appName+"<br/>"); out.println(" </CUERPO>"); out.println("</HTML>"); out.flush(); out.close(); } }
LogoutServlet.java
paquete cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LogoutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) lanza ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); //Salida segura---Basta con hacer que el objeto sesión sea inválido request.getSession().invalidate(); out.println("...salida segura..."); } }
Lo que se ha mencionado anteriormente es la gestión de sesión de JavaWeb que el editor le ha presentado a ustedes, esperamos que les haya sido útil. Si tienen alguna pregunta, déjenos un mensaje y el editor responderá a tiempo.
Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido ha sido contribuido y subido por los usuarios de Internet, este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @ para denunciar, y proporcione evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción de derechos de autor.)