Recuperando variável na sessão destruída

6 respostas
G
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);"
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; 
  } 
}
Eu to esquecendo de algum import ou como faço pra declara essa variavel request??? Desde já aradeço!!!!!

6 Respostas

G

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

M

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

G
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:
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;
  }
}
O que to fazendo de errado??

Valeu!!

G

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

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; 
  } 
}
Alguem tem uma luz?!?! Valeu![/b]
G

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 :)

//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++; 
  } 
}
Valeu pela ajuda de todos!
N

Vc tem que fazer:

HttpSession session = se.getSession();

Não existe a variavel request.

Valeu!!!

Criado 26 de julho de 2004
Ultima resposta 26 de jul. de 2004
Respostas 6
Participantes 3