Recuperando variável na sessão destruída

dae pessoas!!
to tentando fazer com quem meu listener recupere uma variavel que estava na sessão q foi invalidada pelo timeout… aí vai meu código! erro que dá ao compilar: “cannot resolve symbol (variable request)” em “HttpSessionEvent se = request.getSession(false);”

[code]package MeuPacote;

import java.io.;
import javax.servlet.
;
import javax.servlet.http.*;

public class Sessoes implements HttpSessionListener {

private static int sessions = 0;

public void sessionDestroyed (HttpSessionEvent se) {
if (session > 0)
sessions–;
HttpSession s = getSession();
}

public HttpSession getSession() {
HttpSession se = request.getSession(false);
return se;
}

public void sessionCreated (HttpSessionEvent se) {
sessions++;
}

public static int getSessoesAtivas() {
return sessions;
}
}[/code]
Eu to esquecendo de algum import ou como faço pra declara essa variavel request???
Desde já aradeço!!!

mas entao como eu declaro a variavel ‘se’???

ela ja esta sendo passada no parâmetro do teu método…

esse código tá compilando tranquilo, mas quando a sessão é destruida e ele vai recuparar a variavel que preciso, ele reclama que a sessão está invalida (Session already invalidated)!
:roll: :roll:

[code]package pacote;
import java.io.;
import javax.servlet.
;
import javax.servlet.http.*;

public class Sessoes implements HttpSessionListener {
private static int sessions = 0;
String var;

public void sessionDestroyed (HttpSessionEvent se) {
if (sessions > 0)
sessions–;
HttpSession session = se.getSession();
var = (String) session.getAttribute("var");
}
public void sessionCreated (HttpSessionEvent se) {
sessions++;
}
public static int getSessoesAtivas() {
return sessions;
}
}[/code]
O que to fazendo de errado??

Valeu!!

bom, jah q o HttpSessionListener naum tah funcionando, tentei implementar o HttpSessionActivationListener, que deveria chamar o metodo “sessionWillPassivate” quando a sessão estah prestes a morrer. Acontece que ele não eh chamado!!! Aliás, nem o metodo de quando a sessao eh iniciada eh chamado (sessionDidActivate)!

[code]package pacote;
import java.io.;
import javax.servlet.
;
import javax.servlet.http.*;

public class Sessoes implements HttpSessionActivationListener {
public static int sessions;
public void sessionWillPassivate (HttpSessionEvent se) {
HttpSession session = se.getSession(); //Recupera a sessão que foi inativada
String var = (String) session.getAttribute("var");
if (sessions > 0)
sessions–;
}
public void sessionDidActivate (HttpSessionEvent se) {
sessions++;
}
public static int getSessoesAtivas() {
return sessions;
}
}[/code]
Alguem tem uma luz?!?!
Valeu![/b]

No começo de tudo, a sessão é criada, o método sessionCreated é chamado e o contador do número de sessões ativas é incrementado.
Quando a variável que depois terei interesse em recuperá-la (vou chamá-la de ‘var’) eh adicionada à sessão, coloco ela em um array (‘vars[]’) e, com o mesmo índice que usei nesse array, adiciono o id da sessão no array ‘idSessions[]’ para saber a qual sessão a variável ‘var’ pertence.
Quando a sessão é destruída, o método sessionDestroyed é chamado e o contador de sessões ativas decrementado. Ainda nele, recupero o id da sessão (não consegui recuperar nenhuma variável da sessão… dá o erro ‘session already invalidated’). Com o id da sessão recuperado, procuro no array ‘idSessions[]’ em que posição ele se encontra. Com esse índice, localizo ‘var’ no outro array! Aí é só calcular o tempo de duração da sessão e chamar a minha classe!
feito :slight_smile:

[code]//VERIFICA AS SESSOÕES ATIVAS E CHAMA ‘Pagina.java’, passando ‘var’ e ‘total’ como parâmetro
package pacote;
import java.io.;
import java.util.
;
import javax.servlet.;
import javax.servlet.http.
;

public class Sessoes implements HttpSessionListener, HttpSessionAttributeListener {
private static int sessions = 0;
private int i = 0;
private String idSessao;
private String var;

private String[] idSessions = new String[255];
private String[] vars = new String[255];

private long entrou, saiu;
private int horas, minutos, segundos;
private double durou, min, seg;
private String total; //tempo total de duração da sessão

public void attributeAdded (HttpSessionBindingEvent se) {
HttpSession session = se.getSession();

//Pega a veriável adicionada à sessão 
//Caso ela for um 'var', adiciona ela ao array 'vars' 
if (se.getName() == "var") { 
  vars[i] = (String) se.getValue(); 
  //Pega o id da sessão 
  idSessions[i] = session.getId(); 
  if (i < 255) i++; 
  else i=0; 

  entrou = session.getCreationTime(); 
} 

}

public void attributeRemoved (HttpSessionBindingEvent se) {
//vazio
}

public void attributeReplaced (HttpSessionBindingEvent se) {
//vazio
}

public void sessionDestroyed (HttpSessionEvent se) {
//Recupera a sessão que foi inativada
HttpSession session = se.getSession();

idSessao = session.getId(); 

//Verifica qual sessão foi encerrada e recupera o 'var' da sessão antiga 
for (i=0; i<254; i++) 
  if (idSessao == idSessions[i]) 
    var = vars[i]; 

//milisegundos decorridos desde 1/1/1970
saiu = System.currentTimeMillis();

durou = (saiu - entrou) / (1000 * 60 * 60);

horas = (int) durou;
durou = durou - horas;

min = durou*60;
minutos = (int) min;

seg = (min - minutos)*60;
segundos = (int) (seg);

total = horas+""+minutos+""+segundos;

try { 
  //Chama a página que vai atualizar o BD 
  pacote.Pagina p = new pacote.Pagina(); 
  p.Funcao (var, total);
} 
catch (Exception e) { 
  //aqui, não consegui implementar o 'throw new Exception' 
} 

if (sessions > 0) 
  sessions--; 

}
public void sessionCreated (HttpSessionEvent se) {
sessions++;
}
}
[/code]
Valeu pela ajuda de todos!

Vc tem que fazer:

HttpSession session = se.getSession();

Não existe a variavel request.

Valeu!!!