2012-10-08 16 views
9

Ho un problema con una pagina asp classica e non riesco a risolverlo da 3 giorni.ASP classico: ASPSESSIONID multiplo nei cookie

La pagina sta funzionando con Sessioni - a volte capita che il cookie ASPSESSIONID sia impostato due volte nella Request.ServerVariables ("HTTP_COOKIE"). Ciò fa sì che ASP-Page salti tra le due sessioni quando la pagina viene aggiornata.

Ho scritto una pagina di test che restituisce l'attuale SessionId, il software del server e il valore HTTP_COOKIE.

Esempio di output:


Session ID: 308542840

Timeout sessione: 20 minuti

Software Server: Microsoft-IIS/6.0

HTTP_COOKIE: ASPSESSIONIDQCBATRAD = MBHHDGCBGGBJBMAEGLDAJLGF; ASPSESSIONIDQCCDTTCB = PGHPDGCBPLKALGGKIPOFIGDM


perché ci sono due ASPSESSIONIDs? Quando aggiorno la pagina, restituisce in modo casuale uno dei due ID di sessione.

Ecco uno screencast che mostra il problema in IE9: http://prinz-alexander.at/asp_test.avi

Questo errore si verifica spesso in IE8 e IE9.

Basta eseguire le seguenti operazioni per ricreare il problema:

  1. chiudere completamente IE8 o IE9
  2. Inizio IE8 o IE9 e aperto http://www.pfiffikus.at/pfiffikus/tests/
  3. aggiornamento Subito dopo la pagina viene caricata la pagina mutiple volte

Se si ripetono questi passaggi, in modo casuale (non sempre) il HTTP_COOKIE viene popolato con due ASPSESSIONID diversi.

Il file di test asp sta emettendo solo i valori di mentiod, nient'altro sta accadendo nel codice sorgente.

Questo è il codice del file di test 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")) %> 

come posso evitare più ASPSESSIONIds in cookie?

Grazie per qualsiasi aiuto!

+0

inserisci alcuni codici in cui hai assegnato la sessione. – polin

+0

Ho aggiunto il codice alla mia domanda iniziale ... – swervedriver

+0

Hai un giardino Web (pool di app con più di 1 processo) configurato? – AnthonyWJones

risposta

-1

È stato assegnato un valore nella sessione dell'utente. Provate a prendere il tuo prelevare la sessione di questo tipo e assegnare diversi valori unici per ogni utente

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

ok ... Ho appena modificato la mia pagina di test e ho aggiunto quello che hai suggerito (sto aggiungendo un numero casuale alla sessione, vedi anche il codice modificato nella domanda iniziale). Quando provo la pagina in IE9, spesso ottengo ancora due ASPSessionIds e quando li ho a ASPSessionIds nel cookie, quindi su ogni richiesta di pagina salta da un SessionId all'altro (ogni sessione ha il suo "test_val") - il "buffo" "La cosa è che non ho mai ottenuto più di due ASPSessionIds nel cookie - questo è qualcosa che ho dimenticato di menzionare ... – swervedriver

+0

non rispondere come" response.write Session.SessionId ". Semplicemente risposta come response.write (Session ("test")). Un'altra cosa. Ogni volta che aggiorni la pagina il numero cambia. Quindi una sessione deve essere assegnata solo quando un utente effettua il login. – polin

+0

... Ho aggiunto l'istruzione If all'inizio, la sessione "test_val" è impostata solo una volta. Se aggiorno la pagina, il numero rimane lo stesso - il numero cambia ancora dopo ogni richiesta nel tuo caso? – swervedriver

1

anche Questo problema mi ha turbato per molto tempo. E non posso risolverlo.

Non è uno degli affari dei browser. My Chrome, Firefox, IE hanno tutti questo problema.

A volte riesco a vedere più di 20 cookie ASPSESSIONIDXXXX in una sola pagina.

Infine, devo usare javascript per cancellare il vecchio ASPSESSIONID *** e mantenere l'ultimo.

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

Il motivo per cui vedi 20+ ASPSESSIONIDxxxxxx (numero di note di x) potrebbe essere che 1) hai un pool di più server, ciascuno di che non è a conoscenza degli altri 2) Il cookie è impostato per l'intero dominio, non per l'host. Potresti riuscire a risolvere questo problema limitando il nome. vedi: http://stackoverflow.com/questions/7854288/aspsessionid-name-change HTH – arielf

+0

A volte questo funziona, a volte no ... Davvero strano. –

4

Sono stato in grado di rimuovere quei cookie con Javascript.

Basta aggiungere lo script successivo alla fine della pagina di accesso. Questo eliminerà tutti i cookie "ASPSESSIONIDXXXXXXX" prima che l'utente avrà il login al sito internet:

<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

Per quanto sia assurdo farlo, è esattamente quello che dovevo fare per evitare di estrapolare la dimensione dei cookie con centinaia di aspsessionid! – frumbert

-1

Nel file 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

Vai al pool di applicazioni 'Impostazioni avanzate "e impostare" processi di lavoro massima "a 1.

+0

Non è solo l'impostazione web garden, ma sta anche usando un load balancer! Brillante. Non ci avevo pensato. – Brain2000

+0

Questo non risolve il problema ... Ne rimangono ancora molti. –

0

Forse più tardi, ma potrebbe essere utile in quanto non v'è alcuna risposta accettata.

Nel pool di applicazioni, al riciclaggio optio ns, controlla se non lo fai riciclare la tua applicazione troppo presto o finirai con un ASPSESSIONIDXXXXXXX per ogni nuova applicazione che rigenererai.

Esistono diverse condizioni di riciclaggio. Ho impostato il "numero minimo di richieste" su 1 per errore e ho ottenuto un ASPSESSIONID per ogni richiesta