¿Qué es una sesión?
En terminología web, una sesión es simplemente el intervalo de tiempo limitado en el que dos sistemas se comunican entre sí. Los dos sistemas pueden compartir una relación cliente-servidor o de igual a igual. Sin embargo, en el protocolo Http no se mantiene el estado de la comunicación. Por lo tanto, las aplicaciones web que funcionan con el protocolo http utilizan varias tecnologías diferentes que comprenden el Seguimiento de sesión , lo que significa mantener el estado (datos) del usuario para reconocerlo.
Para lograr el seguimiento de la sesión en los servlets, las cookies han sido una de las tecnologías más utilizadas. Sin embargo, tienen las siguientes desventajas:
- Sólo pueden conservar información textual.
- Dependen del navegador. Por lo tanto, si el cliente los deshabilita, su aplicación web no podrá usarlos.
- La cookie individual no puede contener más de 4kb de información
Cómo crear sesiones con una identificación de sesión única para cada usuario en el servlet de Java
Para esto, los servlets proporcionan una interfaz llamada ‘HttpSession’ Interface . El siguiente diagrama explica cómo funcionan las sesiones Http en los servlets:
Métodos en la interfaz HttpSession
Método | Descripción |
---|---|
HttpSession pública getSession() | Obtiene el objeto HttpSession. Si la solicitud no tiene una sesión asociada, se crea una nueva sesión |
HttpSession pública getSession (creación booleana) | Obtiene la sesión asociada a la solicitud. Si aún no está presente, se crea uno nuevo en función del valor del argumento booleano que se le pasó |
string pública getId() | Devuelve la identificación de sesión única |
getCreationTime público largo() | Devuelve la hora en que se creó esta sesión, medida en milisegundos desde la medianoche del 1 de enero de 1970 GMT. |
getLastAccessedTime público largo() | Devuelve la hora en que se accedió por última vez a esta sesión, medida en milisegundos desde la medianoche del 1 de enero de 1970 GMT. |
getLastAccessedTime público largo() | Devuelve la hora en que se accedió por última vez a esta sesión, medida en milisegundos desde la medianoche del 1 de enero de 1970 GMT. |
nulidad pública invalidar() | Invalida la sesión |
Ventajas de las sesiones Http en Servlet
- Cualquier tipo de objeto se puede almacenar en una sesión, ya sea un texto, una base de datos, un conjunto de datos, etc.
- El uso de las sesiones no depende del navegador del cliente.
- Las sesiones son seguras y transparentes.
Desventajas de la sesión Http
- Sobrecarga de rendimiento debido a que el objeto de la sesión se almacena en el servidor
- Sobrecarga debido a la serialización y deserialización de datos
Ejemplo de seguimiento de sesión utilizando la interfaz HttpServlet: En el siguiente ejemplo, los métodos setAttribute() y getAttribute() de la clase HttpServlet se utilizan para crear un atributo en el ámbito de la sesión de un servlet y obtener ese atributo del ámbito de la sesión de otro servlet.
- índice.html
<
html
>
<
head
>
<
body
>
<
form
action
=
"servlet1"
>
Name:<
input
type
=
"text"
name
=
"userName"
/><
br
/>
<
input
type
=
"submit"
value
=
"submit"
/>
</
form
>
</
body
>
</
html
>
- Primero.java
// The first servlet
import
java.io.*;
import
javax.servlet.*;
import
javax.servlet.http.*;
< div
class
=
"noIdeBtnDiv"
>
public
class
First
extends
HttpServlet {
public
void
doGet(HttpServletRequest request, HttpServletResponse response)
{
try
{
/*Declaration of the get method*/
response.setContentType(
"text/html"
);
// Setting the content type to text
PrintWriter out = response.getWriter();
String n = request.getParameter(
"userName"
);
/*Fetching the contents of
the userName field from the form*/
out.print(
"Welcome "
+ n);
// Printing the username
HttpSession session = request.getSession();
/* Creating a new session*/
session.setAttribute(
"uname"
, n);
/*Setting a variable uname
containing the value as the fetched
username as an attribute of the session
which will be shared among different servlets
of the application*/
out.print(
"<a href='servlet2'>visit</a>"
);
// Link to the second servlet
out.close();
}
catch
(Exception e) {
System.out.println(e);
}
}
}
- Segundo.java
// The second servlet
import
java.io.*;
import
javax.servlet.*;
import
javax.servlet.http.*;
public
class
SecondServlet
extends
HttpServlet {
public
void
doGet(HttpServletRequest request, HttpServletResponse response)
try
{
/*Declaration of the get method*/
response.setContentType(
"text/html"
);
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(
false
);
/*Resuming the session created
in the previous servlet using
the same method that was used
to create the session.
The boolean parameter 'false'
has been passed so that a new session
is not created since the session already
exists*/
String n = (String)session.getAttribute(
"uname"
);
out.print(
"Hello "
+ n);
out.close();
}
catch
(Exception e) {
System.out.println(e);
}
}
}
- web.xml
<
web-app
>
<
servlet
>
<
servlet-name
>s1</
servlet-name
>
<
servlet-class
>First</
servlet-class
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>s1</
servlet-name
>
<
url-pattern
>/servlet1</
url-pattern
>
</
servlet-mapping
>
<
servlet
>
<
servlet-name
>s2</
servlet-name
>
<
servlet-class
>Second</
servlet-class
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>s2</
servlet-name
>
<
url-pattern
>/servlet2</
url-pattern
>
</
servlet-mapping
>
</
web-app
>
Producción:
-
índice.html:
-
Servlet1:
-
Servlet2: