Foros del Web » Programando para Internet » ASP Clásico »

Eliminar sessiones

Estas en el tema de Eliminar sessiones en el foro de ASP Clásico en Foros del Web. amigos, nuevamente les escribo con otra inquietud he notado que mis sessiones dentro del servidor se mantienen activas.. incluso aun cuando en mi pagina, al ...
  #1 (permalink)  
Antiguo 03/05/2007, 23:57
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 18 años, 1 mes
Puntos: 88
Eliminar sessiones

amigos, nuevamente les escribo con otra inquietud

he notado que mis sessiones dentro del servidor se mantienen activas.. incluso aun cuando en mi pagina, al final del codigo le agrego session.abandon()

e incluso agrege este pequeño script de GLOBAL.ASA, que nuestro compañero tammander() compartio en ese mismo post

como se que estan activas... bueno... procedi a instalar Opera, Netscape, Firefox, y el injoler exploter.. ejem.. Internet Explorer

al pie de pagina he escrito
Código PHP:
response.write "<br/>Usuarios Conectados("&(Application("numSesion"))&")"

response.write "<br/>Visitas ("&(Application("NumVisitas"))&")" 
como lo denoto, bueno... ejecuto todos los exploradores, entro a la pagina, navego.. etc y despues de un momento cierro los exploradores, y reingreso solo con un explorer y me escribe que tengo 4 usuarios

alguna forma de depurar esta situacion.. algun extra que deba agregar a mi global.asa???
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #2 (permalink)  
Antiguo 04/05/2007, 05:17
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Eliminar sessiones

Hola shiryu ,

Lamentablemente el evento Session_onend no funciona correctamente (KB300883) por lo que la mejor manera de solucionar este problema es bajando el timeout de la session (session.timeout) para que este muera por inactividad. Tambien recuerda bloquear la variable antes de modificarla y debloquearla despues:

Application.lock()
Application("NumSesion") = Application("NumSesion") + 1
Application("NumVisitas") = Application("NumVisitas") + 1
Application.unlock()

Siempre que modifiques algo en alguna variable Application. He estado investigando sobre todo esto ya que hace mucho que ya no utilizo esta forma de averiguar cuantos usuarios hay conectados. Hoy dia lo hago a traves de una BD contrastando IP y sesiones.

Hay varias páginas que tratan el tema, pero todas llegan mas o menos a la misma conclusion:

http://www.asp101.com/resources/active_users.asp

http://www.aspwebpro.com/tutorials/asp/globalasa.asp

Hay tambien una serie de soluciones como comprobar HTTP keep-alive, en este post lo tratan

http://www.thescripts.com/forum/thread166372.html

En esta página aparecen varios formas de hacerlo:

http://classicasp.aspfaq.com/general.../sessions.html


La causa de todo esto es que el evento Session_onend (como te dije antes) no funciona correctamente y Microsoft parece no querer solucionarlo


Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -

Última edición por tammander; 04/05/2007 a las 05:28
  #3 (permalink)  
Antiguo 04/05/2007, 09:09
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 18 años, 1 mes
Puntos: 88
Re: Eliminar sessiones

intentare aplicar algo que las lecturas que me has mandado tamm, gracias por los enlaces...
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #4 (permalink)  
Antiguo 08/05/2007, 06:19
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Eliminar sessiones

Hola! Encontraste algo Shiryu?

Es que ahora me ha surgido a mí un problema, para que el usuario pueda cerrar sesión, tengo en este caso cada vez que un usuario se logea Session("Usuario")="Si", si quiero que un usuario logeado tenga la opción de cerrar su sesión, habría manera de hacerlo, algo tipo
Session("Usuario")="No" where id_user=x no lo tengo en ninguna tabla, sería conveniente poner un campo dentro de la tabla de usuarios para controlar si quiero que se desconecten o no?

Gracias
  #5 (permalink)  
Antiguo 08/05/2007, 08:37
 
Fecha de Ingreso: noviembre-2002
Mensajes: 7
Antigüedad: 22 años, 5 meses
Puntos: 0
Re: Eliminar sessiones

Yo tengo un problema similar. Este es el codigo que tengo en el global.asa:
Código:
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
	Application.Lock
	Application("Active") = 0
	Application.Unlock
End Sub

Sub Session_OnStart
Session.Timeout = 1
	Application.Lock
	Application("Active") = Application("Active") + 1
	Application.Unlock
End Sub

Sub Session_OnEnd
	Application.Lock
	Application("Active") = Application("Active") - 1
	Application.Unlock
End Sub

Sub Application_OnEnd
	'Cualquier cdigo
End Sub
</SCRIPT>
Y el codigo que uso para mostrarlo es este:
Código:
<%=Application("Active")%>
Tengo windows 2003 Server y llevo varios años sin tener ningun problema en lo de mostrar los usuarios online. Sin embargo tras meterle unas actualizaciones de windows, han empezado a dispararse los usuarios online de forma descontrolada.

He probado las cosas que se han citado en este tema pero no hay manera, he llegado a ver 30 mil usuarios online, vamos, ni en mis mejores sueños tendría tal cantidad de gente viendo mi web al mismo tiempo.

Saludos.
  #6 (permalink)  
Antiguo 08/05/2007, 08:58
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 18 años, 1 mes
Puntos: 88
Re: Eliminar sessiones

habria que recordar que al aplicarle una variable de acceso como la que hiciste

session("Usuario")="si"

estas permitiendole al usuario ingresar mientras mantenga viva la conexion con el servidor
y si has puesto

session.Timeout=5
<<--- solo por ejemplo el tiempo(minutos)

si tu usuario, al pasado de 5 minutos no hace ninguna peticion a tu servidor, se eliminaran las variables, de hecho el LOG OUT, que pudieramos implementar nosotros, no es otra cosa mas que una barrida manual(por decirlo asi), de ese proceso automatico

parte de logout, algun punto especifico donde acomodarlo
Código:
<form method="post" action="logout.asp">
<input type=submit value="Cerrar Session"
</form>
en la pagina logout.asp
Código:
<%
session.Contents.RemoveAll()
session.Abandon()
response.write "Salio del sistema"
response.Redirect("ingresar.asp")
%>
algo asi seria la salida, en caso de que le dieras un link como el pequeño formulario

entre tanto enlace que tamm(), escribio anteriormente puse un Global.ASA, de esta forma, espero te sirva, y/o tambien para evaluacion de los muchachos que creo que pudieramos perfeccionarlo

Código PHP:
<object runat="Server" scope="Application"
id="rstActiveUsers" progid="ADODB.Recordset">
</
object>

<
script language="VBScript" runat="Server">
Sub Application_OnStart()
'Seleccionamos una constante de adovbs.inc
    Const adInteger = 3
    Const adVarChar = 200
    Const adDate = 7

'
enlistamos al usuario en memoriaagregando/definiendo los campos
    rstActiveUsers
.Fields.Append "id"adInteger
    rstActiveUsers
.Fields.Append "ip"adVarChar15
    rstActiveUsers
.Fields.Append "browser"adVarChar255
    rstActiveUsers
.Fields.Append "started"adDate

'Ahora abrir para usar el recordset, y agregar los datos de ese usuario
    rstActiveUsers.Open
    Application("NumVisitas") = 0
End Sub

Sub Session_OnStart()
'
asignamos 20 minutos de sessionesto puede variar
    Session
.Timeout 20

'asignamos el tiempo de entrada, aunque segun las lecturas, algunas veces no tiene sentido realizar esto
    Session("Start") = Now()
    
'
preguntamos por logica que no sea el final del recordset
    
If Not rstActiveUsers.EOF Then rstActiveUsers.MoveLast

'agregamos los datos del visitante
    rstActiveUsers.AddNew
    
    rstActiveUsers.Fields("id").Value = _
        Session.SessionID
    
    rstActiveUsers.Fields("ip").Value = _
        Request.ServerVariables("REMOTE_HOST")
    
    rstActiveUsers.Fields("browser").Value = _
        Request.ServerVariables("HTTP_USER_AGENT")
    
    rstActiveUsers.Fields("started").Value = _
        Now()

    rstActiveUsers.Update

'
incremento el numero de visitantesa nuestra websolo por cuestiones estadisticas    
    Application
.lock()
    
Application("NumVisitas") = Application("NumVisitas") + 1
    Application
.unlock()
End Sub

Sub Session_OnEnd
()
'seleccionamos una constante
    Const adAffectCurrent = 1

'
iniciamos el recordset en el primer registro
    rstActiveUsers
.MoveFirst
    
'evaluamos la IDsession, del usuario en cuestion, se evalua con Clong, para que no haya conflictos con los tipos de variables
    Do While Not rstActiveUsers.EOF
        If CLng(rstActiveUsers.Fields("id").Value) = _
            CLng(Session.SessionID) Then
            rstActiveUsers.Delete adAffectCurrent
        End If
        
        rstActiveUsers.MoveNext
    Loop
    
    rstActiveUsers.Update
     Application.lock()
     Application("NumSesion") = Application("NumSesion") - 1
     Application.unlock()
End Sub

Sub Application_OnEnd()
'
y esta parte ocurre cuando se apaga el equipoasi se limpiarian todos los recordsets y liberaria el espacio
    rstActiveUsers
.Close
End Sub
</script>
 
si te fijas, este codigo del Global.asa, hace exactamente lo mismo que te puse en logout.asp, la unica diferencia es que aki se elimina la visita mediante el ID session, que es "unico", dentro del servidor

suerte Shilfild
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #7 (permalink)  
Antiguo 08/05/2007, 09:03
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 18 años, 1 mes
Puntos: 88
Re: Eliminar sessiones

perdon, se me olvido anexarles el como mostrar a los usuarios activos dentro del la pagina.. miren aki esta

Código PHP:
<%
If 
rstActiveUsers.RecordCount 0 Then
    rstActiveUsers
.MoveFirst
    
Do While Not rstActiveUsers.EOF
        Response
.Write " <li>" vbCrLf
        Response
.Write "ID: " rstActiveUsers.Fields("id").Value "<br/>"
        
Response.Write "IP:" rstActiveUsers.Fields("ip").Value "<br/>"
        
Response.Write "Inicio:" rstActiveUsers.Fields("started").Value "<br/>"
        
Response.Write " </li>" vbCrLf
        rstActiveUsers
.MoveNext
    Loop
End 
If
%> 
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #8 (permalink)  
Antiguo 09/05/2007, 02:48
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Eliminar sessiones

Hola! Gracias por la respuesta, pero si realmente, pudiera evitarme poner un Global.ASA preferiria, porque creo que no controlo tanto cómo para complicarme con este tipo de cosas, pero si no hubiera otro remedio, a qué se refiere esto?

" El global.asa se coloca en el directorio raíz de la aplicación "

Que se pone en la carpeta dónde tengas tu proyecto y ya está? no hace falta llamarlo ni nada? Es que esto lo lei en una web pero no consigo entenderlo del todo.

Vale, por otra parte he hecho esto, (sé que la función sobra, pero lo envía, si me dá tiempo ya lo cambiaré, es que sino, no me funciona x_x)

Código:
  </form>
	</table>
	</table>
	
	<tr valign="top">
		<td><form name="formcerrar" id="formcerrar" method="post" action="cerrar.asp">
      <p> 
        <input name="cmdenviar2" type="button" onClick="comprobar_cerrar()" value="Cerrar Sesión">
        Puedes deslogearte</p>
    </form>
Código:
function comprobar_cerrar()
{
		formcerrar.submit()
}
Y en cerrar.asp

Código:
<%@LANGUAGE="VBScript"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
Y en cerrar.asp esto, he metido el alert para saber si llega hasta ahí.. 
<% 	
Session.Contents.RemoveAll()
Session.Abandon()
%>
<script language="javascript">
	alert("Deslogeado!")
</script>
<%
Response.Redirect("index.asp")
	
%>
Pero no funciona, porque yo en index.asp tengo esto justo al comienzo:

Código:
<% if(Session("Usuario")="Si"){
		var login=Request.Cookies("login")%>
		Bienvenido <% Response.Write(login) %>
	ya estás dentro %>
Me muestra el usuario que está conectado, por lo que si después de clickear "Cerrar sesión" al volver al index está Cerrar sesión es que algo va mal, además me muestra el nombre del usuario conectado en ese momento.

Puede ser que sea esta línea? Session.Contents.RemoveAll() Es que uso dreamweaber y es la única en la que los comandos no salen a morado y eso no suele ser normal...
También he probado quitando esa línea de código, pero nada...ah, el if del index sé que funciona, porque si estás logeado no sale la opción de Login y eso lo hace bien, gracias por la ayuda
  #9 (permalink)  
Antiguo 09/05/2007, 09:56
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 18 años, 1 mes
Puntos: 88
Re: Eliminar sessiones

referente al Global.ASA, no hay necesidad de llamar, a menos claro este, que hayas creado tu string de conexion a base de datos en ese archivo.

cuando hacen mencion a la carpeta RAIZ

c:\Inetpub\wwwroot\Proyecto\Global.ASA
c:\Inetpub\wwwroot\Proyecto\Index.ASP
c:\Inetpub\wwwroot\Proyecto\entrar.ASP
c:\Inetpub\wwwroot\Proyecto\salir.ASP

algo asi seria, donde pondrias tu global.asa. en este caso, el DIRECTORIO RAIZ seria PROYECTO
un ejemplo propio

c:\sitios\web\global.asa

Ahora bien, tienes que recordar que si tu usas una variable session, o una variable en COOKIE. cuando el usuario pida LOGOUT("deslogearse"), entonces debes eliminar esas variables especificamente

en inicio de session
<%
....
procedimiento de comprobacion
si fue correcto
session("usuario")=si
reponse.cookie("login")="si"
fin
%>

ahora, en la salida
<%
'debemos eliminar aquellas variables "CONTROL", que permiten al usuario ingresar a nuestro sistema
session("usuario")=""
reponse.cookie("login")=""

%>

por que "", en blanco no es igual a "SI", entonces no podra entrar.

Debemos considerar, que para grabar una cookie se usa el metodo response, pero para llamarlos es REQUEST, entonces si quieres eliminar una variable en COOKIE, debes hacer el response, para qe sobreescriba en esa variable

en cualquier otra duda, aki estamos Shilfild
suerte
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #10 (permalink)  
Antiguo 11/05/2007, 05:12
Avatar de Shilfild  
Fecha de Ingreso: marzo-2007
Mensajes: 120
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Eliminar sessiones

Gracias por la ayuda, me vino perfecta, lo que he hecho ha sido igualar la cookie y la session a "" cómo tu me dijiste y que luego comprobara en el index lo que podia o no hacer n,n y funcionó. Gracias!
  #11 (permalink)  
Antiguo 11/05/2007, 08:29
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 18 años, 1 mes
Puntos: 88
Re: Eliminar sessiones

en dudas aki seguimos, un saludo
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:55.