Re:Timeout de Sessão

4 respostas
spycall

Você pode criar uma classe e implementar a HTTPSessionListener.

public class ControleSessao implements HttpSessionListener {
    
     public void sessionCreated(HttpSessionEvent e){
        // Como devo proceder quando uma sessao é criada
     }
     
     public void sessionDestroyed(HttpSessionEvent e){
        // Como devo proceder quando uma sessao é destruida
     }
 
 }

Assim toda vex que uma sessao for criada ou destruida por timeout, invalidate, etc… vai passar por aí.

4 Respostas

jamikas

Fala TOM,

Seguinte da uma olhada no seguinte link:

http://www.phptr.com/articles/article.asp?p=332851&seqNum=4&rl=1

O segredo é configurar o WAS, para ele aceitar as configurações de session do web.xml ou não. A melhor opção e fazer toda a configuração no config do servidor.

Abços,

“Pensa!!”

WellingtonRamos

Boa tarde a todos,

Estou com um problema num projeto que estou participando onde deve ser implementado Timeout de sessão.

Após uma busca pela internet, não encontrei respostas realmente elucidantes sobre esse tema.

O Ambiente é WebSphere (WAS) e a IDE do projeto (WSAD 5).

Já configurei o web.xml:
<session-config>
	<session-timeout>5</session-timeout>
</session-config>
Entretanto o mesmo, após 5 minutos não finalizava a sessão.

O que fiz:
[list]Criei na sessão um atributo contendo a data do inicio da sessão (verificada com session.isNew() )[/list]
[list]Verifico a cada solicitação se a data atual é maior que a definida no web.xml[/list]
[list]Se for, disparo uma exceção[/list]
[list]Senão, substituo a data da sessão com a data atual[/list]

A questão é, se uso session.invalidate(), a sessão é invalidada, mas numa nova requisição é criada novamente.
Usei então session = null. Desta forma, funcionou a contento no ambiente de teste.

Gostaria de saber se, o que fiz está coerente ou têm forma melhor? Abaixo, trecho de código descrito acima:
HttpSession sessao = request.getSession(false);

if (sessao == null) {
	throw new Exception("Sessão Expirada. Favor efetuar o login novamente.");
}

if(sessao.isNew()){
	sessao.setAttribute("controle.tempo.sessao", new Date());
}

//Se o tempo desde a última sessão for superior a cinco minutos, invalidar a sessão.
//Senão, reiniciar a sessão
Date dataSessao = (Date) sessao.getAttribute("controle.tempo.sessao");
long diff = new Date().getTime() - dataSessao.getTime();

int tempoSessao = sessao.getMaxInactiveInterval(); //Obtém o intervalo da sessão

if(diff < tempoSessao*1000l){ //Comparando com 5 minutos
		sessao.setAttribute("controle.tempo.sessao", new Date());
} else {
//        	sessao.invalidate(); //Invalida a sessão
	sessao = null; //Anula a sessão
	throw new Exception("Sessão Expirada. Favor efetuar o login novamente.");
}

Grato

WellingtonRamos

Então…
No servidor não posso configurar isso, pois é do cliente esse controle :frowning:
Preciso deixar esse controle no escopo da aplicação mesmo.

WellingtonRamos

Com relação a utilizar um Listener, é uma possibilidade que considerei (e ainda considero).
Tenho q cadastrá-lo no web.xml, né?

O problema mesmo é q o timeout configurado no web.xml não acontece. Estou dando uma olhada na documentação do jamikas (Pensa) pra achar algo q me passou em branco.

Criado 30 de julho de 2007
Ultima resposta 30 de jul. de 2007
Respostas 4
Participantes 3