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 
[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!