Serie de conferencias ASP (19) Gestión de sesiones
Autor:Eve Cole
Fecha de actualización:2009-05-30 19:58:38
Uno de los desafíos del desarrollo exitoso de aplicaciones web es mantener la información del usuario mientras el usuario salta de una página a otra en una aplicación durante una visita o sesión de usuario. HTTP es un protocolo sin estado, lo que significa que el servidor web trata cada acceso a una página como un acceso no relacionado; el servidor no retiene ninguna información sobre el acceso anterior, incluso si el acceso ocurre dentro de unos pocos días del acceso actual. atrás. Esta falta de memoria de visitas anteriores dificulta la redacción de aplicaciones como catálogos en línea, que pueden necesitar realizar un seguimiento de los elementos del catálogo que un usuario ha seleccionado mientras salta entre diferentes páginas del catálogo.
ASP proporciona una solución única para gestionar problemas de información de sesiones. Utilizando el objeto Sesión ASP y una ID de usuario especial generada por su servidor, puede crear una aplicación inteligente que pueda identificar a cada usuario entrante y recopilar información utilizada por la aplicación para rastrear las preferencias o selecciones de contenido del usuario.
ASP establece la identificación del usuario a través de cookies HTTP. Las cookies HTTP son pequeños archivos almacenados en el navegador del usuario. Por lo tanto, si está creando una aplicación para un navegador que no admite cookies, o si sus clientes han configurado sus navegadores para que no acepten cookies, no utilice la función de administración de sesiones de ASP.
También puede escribir scripts que se ejecuten cuando la aplicación se inicie o finalice.
Iniciar y finalizar sesiones Las sesiones se pueden iniciar de tres maneras:
Un nuevo usuario solicita acceso a una URL que identifica un archivo .asp en una aplicación cuyo archivo Global.asa contiene el procedimiento Session_OnStart.
El usuario almacena un valor en el objeto Sesión.
El usuario solicita el archivo .asp de una aplicación y el archivo Global.asa de la aplicación utiliza la etiqueta <OBJECT> para crear una instancia del objeto con alcance de sesión.
Si el usuario no solicita ni actualiza ninguna página de la aplicación durante un período de tiempo específico, la sesión finalizará automáticamente. El valor predeterminado para este período es 20 minutos. Puede cambiar la configuración del límite de tiempo de espera predeterminado de la aplicación configurando la propiedad "Tiempo de espera de sesión" en la página de propiedades "Opciones de aplicación" en el Administrador de servicios de Internet. Este valor debe establecerse según los requisitos de su aplicación web y el espacio de memoria del servidor. Por ejemplo, si desea que los usuarios que navegan por su aplicación web permanezcan en cada página solo unos minutos, debe acortar el valor de tiempo de espera predeterminado de la sesión. Un valor de tiempo de espera de sesión demasiado largo provocará que demasiadas sesiones abiertas agoten los recursos de memoria de su servidor.
Para una sesión específica, si desea establecer un valor de tiempo de espera menor que el valor de tiempo de espera predeterminado, puede establecer la propiedad Tiempo de espera del objeto Sesión. Por ejemplo, el siguiente script establece el valor de tiempo de espera en 5 minutos.
<%Sesión.Tiempo de espera = 5%>
También puede establecer un valor de tiempo de espera mayor que la configuración predeterminada. La propiedad Session.Timeout determina el valor de tiempo de espera.
También puede finalizar explícitamente una sesión a través del método Abandon del objeto Session. Por ejemplo, para proporcionar un botón Salir en una tabla, establezca el parámetro ACCIÓN del botón en la dirección URL de un archivo .asp que contenga el siguiente comando.
<% Sesión.Abandonar %>
Acerca del ID de sesión y las cookies
Cuando un usuario solicita por primera vez un archivo .asp en una aplicación determinada, ASP genera un ID de sesión. SessionID es un número generado por un algoritmo complejo que identifica de forma única cada sesión de usuario. Al comienzo de una nueva sesión, el servidor almacena el ID de sesión como una cookie en el navegador web del usuario.
Un SessionID es muy parecido a una clave en el sentido de que ASP puede almacenar información del usuario en un lugar "seguro" en el servidor cuando el usuario interactúa con la aplicación durante una sesión. Así como se puede usar una clave para acceder a los elementos de una caja fuerte, se puede acceder al contenido de la "caja fuerte" a través de la cookie SessionID del usuario enviada en el encabezado de la solicitud HTTP. Cada vez que ASP recibe una solicitud de página, verifica el encabezado de la solicitud HTTP para obtener la cookie SessionID.
Después de que la cookie SessionID se almacena en el navegador del usuario, ASP aún reutiliza la cookie para rastrear la sesión incluso si el usuario solicita otro archivo .asp o solicita un archivo .asp que se ejecuta en otra aplicación. De manera similar, si el usuario abandona intencionalmente la sesión o deja que se agote el tiempo de sesión y luego solicita otro archivo .asp, ASP iniciará una nueva sesión con la misma cookie. Solo cuando el administrador del servidor reinicie el servidor o el usuario reinicie el navegador web, la configuración de SessionID almacenada en la memoria se borrará y el usuario obtendrá una nueva cookie de SessionID.
Al reutilizar la cookie SessionID, ASP minimiza la cantidad de cookies enviadas al navegador del usuario. Alternativamente, si decide que su aplicación ASP no requiere administración de sesiones, puede evitar que ASP rastree sesiones y envíe ID de sesión a los usuarios.
ASP no envía cookies de sesión en las siguientes circunstancias:
El estado de sesión de la aplicación está deshabilitado.
Una página ASP se define como sin sesión, es decir, la página contiene la etiqueta <%@ EnableSessionState=False %>.
Tenga en cuenta que la cookie SessionID no proporciona un método permanente para rastrear a un usuario en múltiples visitas a un sitio web. La información de SessionID almacenada en la memoria del servidor se puede perder fácilmente. Si desea realizar un seguimiento de los usuarios que visitan su aplicación web a lo largo del tiempo, debe crear una identidad de usuario almacenando una cookie especial en el navegador web del usuario y guardando la información de la cookie en una base de datos.
Almacenar datos en el objeto de sesión
El objeto Session proporciona una matriz asociativa dinámica en la que se puede almacenar información. Puede almacenar variables numéricas y variables de objetos en objetos de sesión.
Las variables se pueden almacenar en un objeto de sesión asignando valores a elementos con nombre en el objeto de sesión. Por ejemplo, el siguiente comando almacena dos nuevas variables en el objeto Sesión:
<%
Sesión("Nombre") = "Jeff"
Sesión("Apellido") = "Smith"
%>
Se puede obtener información del objeto Sesión accediendo a este elemento con nombre. Por ejemplo, muestre el valor actual de Session("FirstName"):
Bienvenido <%= Sesión("Nombre") %>
Puede almacenar las preferencias del usuario en el objeto Sesión y luego acceder a las preferencias para decidir qué página enviar al usuario. Por ejemplo, puede permitir que los usuarios especifiquen una versión de contenido de solo texto en la primera página de su aplicación y aplicar esta selección a todas las páginas posteriores de la aplicación que visite el usuario.
<% Si Session("ScreenResolution") = "Bajo" Entonces %>
Esta es la versión de texto de la página.
<%Más%>
Esta es la versión multimedia de la página.
<% Finalizar si %>
También puede almacenar una instancia de objeto en el objeto Sesión, pero hacerlo afectará el rendimiento del servidor.
Administrar sesiones de Web Farm
La información de la sesión ASP se almacena en el servidor web. El navegador debe solicitar una página del servidor web para obtener el script utilizado para acceder a la información de la sesión. En una granja web (donde muchos servidores web comparten la responsabilidad de responder a las solicitudes de los usuarios), las solicitudes de los usuarios no siempre se enrutan al mismo servidor, sino a la URL mediante un software especial llamado proceso de "equilibrio de carga" de la aplicación del sitio. está asignado a cualquier servidor gratuito. El proceso de equilibrio de carga dificulta la conservación de la información de la sesión en Web Farm.
Para utilizar la administración de sesiones ASP en un sitio con equilibrio de carga, debe asegurarse de que todas las solicitudes de una sesión de usuario se dirijan al mismo servidor web. Un método consiste en escribir un procedimiento Session_OnStart que utilice un objeto Respuesta para redirigir el navegador al servidor web que ejecuta la sesión del usuario. Si todos los enlaces en las páginas de su aplicación son relativos, todas las solicitudes futuras de una página se enrutarán al mismo servidor.
Por ejemplo, un usuario desea acceder a una aplicación solicitando la URL universal de un sitio: http://www.microsoft.com. El proceso de equilibrio de carga enruta las solicitudes al servidor server3.microsoft.com. ASP generó una nueva sesión de usuario en este servidor. Durante el proceso Session_OnStart, el navegador se redirige al servidor especificado:
<% Response.Redirect("http://server3.microsoft.com/webapps/firstpage.asp") %>
El navegador solicitará la página especificada y todas las solicitudes futuras se dirigirán al mismo servidor.
Utilizar cookies
Una cookie es un token que el servidor web incorpora en el navegador web del usuario para representar al usuario. La próxima vez que el mismo navegador solicite una página, enviará la cookie recibida del servidor Web. Una cookie permite asociar un conjunto de información a un usuario. Los scripts ASP utilizan la colección Cookies de objetos Respuesta y Solicitud para obtener y establecer valores de cookies.
Establecer cookies
Para establecer el valor de una cookie, utilice Response.Cookies. Si la cookie no existe, Response.Cookies creará una nueva cookie. Por ejemplo, para enviar un nombre de cookie ("planeta") con un valor asociado ("Marte") al navegador, utilice los siguientes comandos, que deben aparecer antes de la etiqueta <HTML> de su página web:
<% Response.Cookies("planeta")="Marte" %>
Si solo desea que la cookie se utilice durante la sesión actual del usuario, simplemente envíe la cookie al navegador. Sin embargo, si desea reconocer al usuario después de que haya cerrado o reiniciado el navegador, debe forzar al navegador a almacenar la cookie en el disco duro del ordenador. Para guardar una cookie, utilice la propiedad Expires de Response.Cookies y establezca la fecha en un día en el futuro:
<%
Response.Cookies("planeta") = "Marte"
Response.Cookies("planeta").Expires = "1 de enero de 1999"
%>
Una cookie puede tener varios valores; dicha cookie se denomina cookie indexada. A cada valor de cookie se le asigna una palabra clave; puede establecer el valor de una palabra clave de cookie específica. Por ejemplo:
<% Response.Cookies("planeta")("Marte")="Misiones Espaciales" %>
Si una cookie existente tiene un valor de palabra clave pero Response.Cookies no especifica el nombre de una palabra clave, el valor de la palabra clave se eliminará. De manera similar, si una cookie existente no tiene un valor de palabra clave pero Response.Cookies especifica el nombre y el valor de la palabra clave, el valor de la cookie existente se eliminará y se generará un nuevo par clave-valor.
obtener galletas
Para obtener el valor de una cookie, utilice la colección Request.Cookies. Por ejemplo, si la solicitud HTTP del usuario establece planet=Mars, la siguiente declaración obtendrá el valor Mars:
<%= Solicitud.Cookies("planeta") %>
De manera similar, para obtener el valor de una palabra clave de una cookie indexada, utilice el nombre de la palabra clave. Por ejemplo, si el usuario realiza la siguiente solicitud HTTP:
planeta=Marte&Marte=Misiones Espaciales
El siguiente script devolverá el valor SpaceMissions:
<%= Solicitud.Cookies("planeta")("Marte") %>
Configuración de la ruta de las cookies Cada cookie almacenada por ASP en el navegador web del usuario contiene información de la ruta. Cuando el navegador solicita un archivo cuya ubicación es la misma que la ruta especificada en la cookie, el navegador reenvía automáticamente la cookie al servidor. De forma predeterminada, la ruta de la cookie corresponde al nombre de la aplicación que contiene el archivo .asp que generó originalmente la cookie. Por ejemplo, si un archivo .asp en una aplicación llamada UserApplication genera una cookie, cada vez que el navegador web del usuario recupera el archivo en esta aplicación, el navegador también reenvía esta cookie al servidor.
Para declarar una ruta para una cookie que sea diferente de la ruta de aplicación predeterminada, utilice la propiedad Path de la colección Response.Cookies de ASP. Por ejemplo, el siguiente script asigna la ruta SalesApp/Cliente/Perfiles/ a una cookie denominada Compras:
<%
Respuesta.Cookies("Compras") = "12"
Response.Cookies("Compras").Expires = "1 de enero de 2001"
Response.Cookies("Compras").Path = "/SalesApp/Cliente/Perfiles/"
%>
Siempre que un navegador web que contiene la cookie de Compras solicita un archivo ubicado en la ruta /SalesApp/Cliente/Profiles/ o sus subdirectorios, el navegador reenvía la cookie al servidor.
Muchos navegadores web, incluidos Microsoft Internet Explorer 4.0 y Netscape, conservan las rutas de las cookies. Es decir, si el caso de un archivo solicitado es diferente de la ruta de la cookie reservada, el navegador no reenviará la cookie al servidor. Por ejemplo, para ASP, los directorios virtuales /TRAVEL y /travel son la misma aplicación ASP, pero para los navegadores que conservan las URL en mayúsculas, /TRAVEL y /travel son dos aplicaciones diferentes. Debe asegurarse de que todas las URL del archivo .asp tengan el mismo caso para garantizar que el navegador del usuario pueda reenviar la cookie almacenada.
Si lo desea, puede utilizar la siguiente declaración para configurar la ruta de la cookie de modo que la cookie se reenvíe cada vez que el navegador web del usuario solicite un archivo de su servidor, independientemente de la aplicación o ruta:
Respuesta.Cookies("Compras").Path = "/"
Sin embargo, tenga en cuenta que enviar cookies al servidor sin distinguir entre aplicaciones puede crear problemas de seguridad si la cookie contiene información confidencial a la que no deberían acceder otros programas que no sean la aplicación designada.
Preservar el estado sin utilizar cookies No todos los navegadores admiten cookies. Incluso cuando se utiliza un navegador que admite cookies, algunos usuarios pueden preferir desactivar la compatibilidad con cookies. Si su aplicación necesita responder a navegadores que no admiten cookies, debe utilizar la gestión de sesiones ASP.
Si no utiliza la gestión de sesiones ASP, debe escribir su propio mecanismo para pasar información entre las páginas de su aplicación. Hay dos formas generales de realizar esta tarea:
Agregue parámetros a la cadena de consulta de la URL. Por ejemplo:
http://MiServidor/MiAplicación/start.asp?name=Jeff
Sin embargo, algunos navegadores descartarán los parámetros explícitos pasados en la cadena de consulta cuando el formulario se envíe con el método GET.
Agrega valores ocultos a la tabla. Por ejemplo, la siguiente tabla HTML contiene un control implícito. Este control no aparece en el formulario real y no es visible para el navegador web del usuario. A través del método HTTP POST, el formulario pasa el ID del usuario además de la información proporcionada por el usuario.
<FORM METHOD="POST" ACTION="/scripts/inform.asp">
<TIPO DE ENTRADA="texto" NOMBRE="ciudad" VALOR="">
<TIPO DE ENTRADA="texto" NOMBRE="país" VALOR="">
<TIPO DE ENTRADA="oculto" NOMBRE="ID de usuario" VALOR= <%=NúmIDUsuario(i) %>
<TIPO DE ENTRADA="enviar" VALOR="Introducir">
Este método requiere que todos los destinos de los enlaces que transfieren información del usuario estén codificados como tablas HTML.
Si actualmente no utiliza la administración de sesiones ASP, desactive la compatibilidad con sesiones para su aplicación. Cuando se habilita una sesión, ASP envía la cookie SessionID a cada navegador que solicita una página ASP. Para desactivar el soporte de sesión, desactive la casilla de verificación Habilitar estado de sesión en la página de propiedades Opciones de aplicación en el Administrador de servicios de Internet.
Página ASP sin sesión
ASP también ofrece la posibilidad de crear páginas sin sesión, que puede utilizar para diferir la creación de sesiones hasta que el usuario acceda a una página ASP que requiera seguimiento de sesiones.
Las páginas sin sesión no realizan las siguientes funciones:
Ejecute el procedimiento Session_OnStart.
Enviar cookie de identificación de sesión.
Crear objeto de sesión.
Acceda a objetos de sesión integrados o a objetos con ámbito de sesión creados con la etiqueta <OBJECT>.
Ejecutado secuencialmente con otras solicitudes de sesión.
Para configurar .asp para que no tenga sesión, utilice la siguiente declaración:
<%@ EnableSessionState=Falso %>
Debe colocar este script en la primera línea del archivo .asp, antes que otros scripts. De forma predeterminada, si se omite este indicador, el seguimiento de sesiones está habilitado.
Las páginas ASP sin sesión mejoran el rendimiento de la respuesta del servidor al eliminar operaciones de sesión que pueden consumir mucho tiempo. Por ejemplo, considere la siguiente situación: una página ASP contiene dos marcos HTML, Marco 1 y Marco 2, en un conjunto de marcos. El cuadro 1 contiene un archivo .asp que ejecuta un script complejo, mientras que el cuadro 2 contiene un archivo .html simple. Debido a que ASP ejecuta solicitudes de sesión de forma secuencial (es decir, en serie), no verá el contenido del fotograma 2 hasta que se ejecute el script para el fotograma 1. Sin embargo, si configura el fotograma 1 como sin sesión, la solicitud ASP ya no se procesa en serie y el navegador no tiene que esperar a que el contenido del fotograma 1 termine de ejecutarse antes de poder procesar el contenido del fotograma 2.
Sin embargo, la forma en que se manejan las solicitudes múltiples para diferentes marcos depende en última instancia de la configuración del navegador web del usuario. Algunos navegadores web pueden ignorar la configuración sin sesión de su archivo .asp y aún manejar solicitudes en serie.