Servlets: seguimiento de sesiones
HTTP es un protocolo "sin estado", lo que significa que cada vez que un cliente recupera una página web, el cliente abre una conexión separada al servidor web y el servidor automáticamente no guarda ningún registro de la solicitud anterior del cliente.
Aún así, hay tres formas de mantener la sesión entre el cliente web y el servidor web:
Galletas
Un servidor web puede asignar un ID de sesión único como una cookie a cada cliente web y, para las solicitudes posteriores del cliente, pueden ser reconocidos utilizando la cookie recibida.
Es posible que esta no sea una forma eficaz porque muchas veces el navegador no admite una cookie, por lo que no recomendaría utilizar este procedimiento para mantener las sesiones.
Campos de formulario ocultos
Un servidor web puede enviar un campo de formulario HTML oculto junto con una ID de sesión única de la siguiente manera:
<input type = "hidden" name = "sessionid" value = "12345">
Esta entrada significa que, cuando se envía el formulario, el nombre y el valor especificados se incluyen automáticamente en los datos GET o POST. Cada vez que el navegador web devuelve la solicitud, el valor de session_id se puede usar para realizar un seguimiento de los diferentes navegadores web.
Esta podría ser una forma eficaz de realizar un seguimiento de la sesión, pero al hacer clic en un enlace de hipertexto normal (<A HREF...>) no se envía un formulario, por lo que los campos de formulario ocultos tampoco pueden admitir el seguimiento general de la sesión.
Reescritura de URL
Puede agregar algunos datos adicionales al final de cada URL que identifica la sesión, y el servidor puede asociar ese identificador de sesión con los datos que ha almacenado sobre esa sesión.
Por ejemplo, con http://tutorialspoint.com/file.htm;sessionid = 12345, el identificador de sesión se adjunta como sessionid = 12345 al que se puede acceder en el servidor web para identificar al cliente.
La reescritura de URL es una mejor manera de mantener sesiones y funciona incluso cuando los navegadores no admiten cookies. El inconveniente de la reescritura de URL es que tendría que generar cada URL de forma dinámica para asignar una ID de sesión, incluso en el caso de una página HTML estática simple.
El objeto HttpSession
Aparte de las tres formas mencionadas anteriormente, servlet proporciona una interfaz HttpSession que proporciona una forma de identificar a un usuario en más de una solicitud de página o visita a un sitio web y para almacenar información sobre ese usuario.
El contenedor de servlets utiliza esta interfaz para crear una sesión entre un cliente HTTP y un servidor HTTP. La sesión persiste durante un período de tiempo específico, en más de una conexión o solicitud de página del usuario.
Obtendría el objeto HttpSession llamando al método público getSession() de HttpServletRequest, como se muestra a continuación -
HttpSession session = request.getSession();
Debe llamar a request.getSession () antes de enviar el contenido del documento al cliente. Aquí hay un resumen de los métodos importantes disponibles a través del objeto HttpSession:
No Señor. | Método y descripción |
---|---|
1 | public Object getAttribute(String name) Este método devuelve el objeto vinculado con el nombre especificado en esta sesión, o nulo si no hay ningún objeto vinculado con el nombre. |
2 | public Enumeration getAttributeNames() Este método devuelve una enumeración de objetos String que contiene los nombres de todos los objetos vinculados a esta sesión. |
3 | public long getCreationTime() Este método devuelve la hora en que se creó esta sesión, medida en milisegundos desde la medianoche del 1 de enero de 1970 GMT. |
4 | public String getId() Este método devuelve una cadena que contiene el identificador único asignado a esta sesión. |
5 | public long getLastAccessedTime() Este método devuelve la última hora de la sesión a la que se accedió, en el formato de milisegundos desde la medianoche del 1 de enero de 1970 GMT. |
6 | public int getMaxInactiveInterval() Este método devuelve el intervalo de tiempo máximo (segundos) que el contenedor de servlets mantendrá abierta la sesión entre accesos de clientes. |
7 | public void invalidate() Este método invalida esta sesión y desvincula cualquier objeto vinculado a ella. |
8 | public boolean isNew( Este método devuelve verdadero si el cliente aún no conoce la sesión o si el cliente elige no unirse a la sesión. |
9 | public void removeAttribute(String name) Este método elimina el objeto vinculado con el nombre especificado de esta sesión. |
10 | public void setAttribute(String name, Object value) Este método vincula un objeto a esta sesión, utilizando el nombre especificado. |
11 | public void setMaxInactiveInterval(int interval) Este método especifica el tiempo, en segundos, entre las solicitudes del cliente antes de que el contenedor de servlets invalide esta sesión. |
Ejemplo de seguimiento de sesiones
Este ejemplo describe cómo utilizar el objeto HttpSession para averiguar la hora de creación y la hora del último acceso a una sesión. Asociaríamos una nueva sesión con la solicitud si aún no existe una.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your web page.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<h2 align = \"center\">Session Infomation</h2>\n" +
"<table border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
" <th>Session info</th><th>value</th>
</tr>\n" +
"<tr>\n" +
" <td>id</td>\n" +
" <td>" + session.getId() + "</td>
</tr>\n" +
"<tr>\n" +
" <td>Creation Time</td>\n" +
" <td>" + createTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Time of Last Access</td>\n" +
" <td>" + lastAccessTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>User ID</td>\n" +
" <td>" + userID + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Number of visits</td>\n" +
" <td>" + visitCount + "</td>
</tr>\n" +
"</table>\n" +
"</body>
</html>"
);
}
}
Compila el servlet anterior SessionTracky cree la entrada adecuada en el archivo web.xml. Ahora, al ejecutar http: // localhost: 8080 / SessionTrack, se mostrará el siguiente resultado cuando se ejecute por primera vez:
Welcome to my website
Session Infomation
Session info
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
0
Ahora intente ejecutar el mismo servlet por segunda vez, mostrará el siguiente resultado.
Welcome Back to my website
Session Infomation
info type
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
1
Eliminar datos de la sesión
Cuando haya terminado con los datos de sesión de un usuario, tiene varias opciones:
Remove a particular attribute- Puede llamar al método public void removeAttribute (String name) para eliminar el valor asociado con una clave en particular.
Delete the whole session- Puede llamar al método public void invalidate () para descartar una sesión completa.
Setting Session timeout- Puede llamar al método public void setMaxInactiveInterval (int interval) para establecer el tiempo de espera de una sesión individualmente.
Log the user out - Los servidores que admiten servlets 2.4, puede llamar logout para cerrar la sesión del cliente en el servidor web e invalidar todas las sesiones que pertenecen a todos los usuarios.
web.xml Configuration - Si está utilizando Tomcat, además de los métodos mencionados anteriormente, puede configurar el tiempo de espera de la sesión en el archivo web.xml de la siguiente manera.
<session-config>
<session-timeout>15</session-timeout>
</session-config>
El tiempo de espera se expresa en minutos y anula el tiempo de espera predeterminado, que es de 30 minutos en Tomcat.
El método getMaxInactiveInterval () en un servlet devuelve el período de tiempo de espera para esa sesión en segundos. Entonces, si su sesión está configurada en web.xml durante 15 minutos, getMaxInactiveInterval () devuelve 900.