2012-10-08 99 views
9

Tengo un problema con una página asp clásico y no puedo resolverlo desde hace 3 días.ASP clásico: ASPSESSIONID múltiple en cookies

La página está trabajando con Sesiones: a veces sucede que la cookie ASPSESSIONID se establece dos veces en Request.ServerVariables ("HTTP_COOKIE"). Esto hace que ASP-Page salte entre las dos sesiones cuando se actualiza la página.

He escrito una página de prueba que muestra el SessionId actual, el software del servidor y el valor de HTTP_COOKIE.

salida

muestra:


Session ID: 308542840

Session Timeout: 20 minutos

de software del servidor: Microsoft-IIS/6.0

HTTP_COOKIE: ASPSESSIONIDQCBATRAD = MBHHDGCBGGBJBMAEGLDAJLGF; ASPSESSIONIDQCCDTTCB = PGHPDGCBPLKALGGKIPOFIGDM


¿Por qué hay dos ASPSESSIONIDs? Cuando actualizo la página, muestra aleatoriamente una de las dos ID de sesión.

Aquí es un screencast que muestra el problema en IE9: http://prinz-alexander.at/asp_test.avi

Este error se produce a menudo en IE8 e IE9.

Sólo haga lo siguiente para volver a crear el problema:

  1. Cierre completamente IE8 o IE9
  2. inicio IE8 o IE9 y abierto http://www.pfiffikus.at/pfiffikus/tests/
  3. de actualización Inmediatamente después de la página se carga la página veces mutiple

Si repite estos pasos, al azar (no siempre) HTTP_COOKIE se rellena con dos ASPSESSIONID ID diferentes.

El archivo de prueba asp solo está produciendo los valores de mentiod, nada más está sucediendo en el código fuente.

Este es el código del archivo de prueba ASP:

<% If trim(Session("test_val")) = "" Then 
    Dim my_num 
    Randomize 
    number = Int((rnd*1000))+1 
    Session("test_val") = number 
    End If 
%> 

<b>Session ID:</b> 
<% response.write(Session.SessionId) %><br /><br /> 

<b>Session("test_val"):</b> 
<% response.write(Session("test_val")) %><br /><br /> 

<b>Session Timeout:</b> 
<% response.write(Session.Timeout) %> minutes<br /><br /> 

<b>Server Software:</b> 
<% response.write(Request.ServerVariables("SERVER_SOFTWARE")) %><br /> <br /> 

<b>HTTP_COOKIE:</b> <% response.write(Request.ServerVariables("HTTP_COOKIE")) %> 

¿Cómo puedo evitar múltiples ASPSESSIONIds en las galletas?

¡Gracias por cualquier ayuda!

+0

publico algunos códigos donde ha asignado su sesión. – polin

+0

He agregado el código a mi pregunta inicial ... – swervedriver

+0

¿Tiene configurado un jardín web (grupo de aplicaciones con más de 1 proceso)? – AnthonyWJones

Respuesta

-1

Has asignado a un valor en la sesión del usuario. Pruebe a buscar de Explorar la sesión de esta manera y asignar diferentes valores únicos para cada usuario

<% 
Session("test") = "test value" 
a=Session("test") 
response.Write(a) 
%> 
+0

ok ... Acabo de editar mi página de prueba y agregué lo que me sugirió (estoy agregando un número aleatorio a la sesión, también veo el código editado en la pregunta inicial). Cuando pruebo la página en IE9, a menudo todavía tengo dos ASPSessionIds y cuando los tengo en ASPSessionIds en la cookie, en cada solicitud de página salta de un SessionId a otro (cada sesión tiene su propio "test_val") - el "gracioso" "Lo cierto es que nunca recibo más de exactamente dos ASPSessionIds en la cookie, esto es algo que olvidé mencionar ... – swervedriver

+0

no responden como" response.write Session.SessionId ". Simplemente respuesta como response.write (Session ("prueba")). Otra cosa. Cada vez que actualiza la página, el número cambia. Por lo tanto, una sesión debe asignarse solo cuando un usuario inicia sesión. – polin

+0

... He agregado la declaración If al principio, la sesión "test_val" solo se establece una vez. Si actualizo la página, el número permanece igual. ¿El número sigue cambiando después de cada solicitud en su caso? – swervedriver

1

Este problema también me preocupó durante mucho tiempo. Y no puedo resolverlo.

No es nada del negocio de los navegadores. Mi Chrome, Firefox, IE tienen este problema.

A veces puedo ver más de 20 cookies de ASPSESSIONIDXXXX en una sola página.

Finalmente debo usar javascript para borrar el antiguo ASPSESSIONID *** y conservar el último.

function clearASPSESSIONID(){ 
    var cks = document.cookie.match(/\b(ASPSESSIONID[A-Z]+)(?==)/g), 
     lskey = 'oldASPSESSIONID-'+location.protocol+'//'+location.host, 
     old = window.localStorage ? localStorage.getItem(lskey) : '', 
     keep, i; 
    for(i=0;i<cks.length;i++){ 
     if((old && old.indexOf(cks[i])<0) || i==cks.length-1){ 
      keep = cks[i]; 
     } 
    } 
    for(i=0;i<cks.length;i++){ 
     if(keep != cks[i]){ 
      document.cookie = cks[i] + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; 
     } 
    } 
    if(window.localStorage){ 
     localStorage.setItem(lskey, keep ? keep : ''); 
    } 
} 
clearASPSESSIONID(); 
+1

El motivo por el que ve 20+ ASPSESSIONIDxxxxxx (número de nota de x) puede ser que 1) tiene un grupo de servidores múltiples, cada uno de que no tiene conocimiento de los demás 2) La cookie está configurada para todo el dominio, no para el host. Puede resolver esto restringiendo el nombre. ver: http://stackoverflow.com/questions/7854288/aspsessionid-name-change HTH – arielf

+0

A veces esto funciona, algunas veces no ... Realmente extraño. –

4

Pude eliminar esas cookies con Javascript.

Simplemente agregue la siguiente secuencia de comandos al final de la página de inicio de sesión. Esto eliminará todas las cookies "ASPSESSIONIDXXXXXXX" antes que el usuario va a acceder a la página web:

<script type="text/javascript"> 
    //Clear any session cookies 
    (function(){ 
     var cookiesArr = document.cookie.split("; "); 
     for (var i = 0; i < cookiesArr.length; i++) { 
      var cItem = cookiesArr[i].split("="); 
      if (cItem.length > 0 && cItem[0].indexOf("ASPSESSIONID") == 0) { 
       deleteCookie(cItem[0]); 
      } 
     } 

     function deleteCookie(name) { 
      var expDate = new Date(); 
      expDate.setTime(expDate.getTime() - 86400000); //-1 day 
      var value = "; expires=" + expDate.toGMTString() + ";path=/"; 
      document.cookie = name + "=" + value; 
     } 
    })(); 
</script> 
+0

¡Tan absurdo como es hacer esto, es exactamente lo que tuve que hacer para evitar exceder el tamaño de la cookie con cientos de aspsessionid! – frumbert

-1

En archivo global.asa:

Sub Session_OnStart 

    Dim cookie, cookies : cookies = Split(Request.ServerVariables("HTTP_COOKIE"),";") 
    For Each cookie In cookies 
     cookie = Trim(Split(cookie,"=")(0)) 
     If Left(cookie,12) = "ASPSESSIONID" Then 
      Response.AddHeader "Set-Cookie", cookie&"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/" 
     End If 
    Next 

End Sub 
1

Ir al grupo de aplicaciones 'Configuración avanzada 'y' establecer procesos de trabajo máxima "a 1.

+0

No es solo la configuración del jardín web, sino que también utiliza un equilibrador de carga. Brillante. No había pensado en eso. – Brain2000

+0

Esto no resuelve el problema ... Todavía quedan muchos de ellos. –

0

Tal vez más tarde, pero podría ser útil ya que no hay respuesta aceptada.

del inventario de aplicación, en el reciclaje optio ns, verifique si no lo hace recicle su aplicación demasiado pronto o terminará con un ASPSESSIONIDXXXXXXX por cada nueva aplicación que reaparezca.

Existen varias condiciones de reciclaje. Establecí el "número mínimo de solicitudes" en 1 por error y obtuve un ASPSESSIONID para cada solicitud