Encerrar sessão

Saudações aos sábios e aprendizes.

Galera, estou com a seguinte questão a ser resolvida.
Tenho uma aplicação web. Estou inserindo um controle de acesso às páginas utilizando PhaseListener. Até aqui está tudo perfeito.
Agora eu gostaria de implementar a seguinte lógica:

Caso o usuário feche a aplicação(no X de uma determinada página do meu sistema - /principal/apresentacao.jsp), a sessão seja finalizada.

Desde já agradeço a leitura de todos e espero o compartilhar bons conhecimentos neste tópico.

Abraços.

Ao fechar a página ela não envia nada para o servidor.

Você deveria fazer tipo um pop up que tem algum alguns sites perguntando: "vc quer realmente sair?.

Se o cara clicar ok, você poderia disparar uma chamada ajax.

Mas geralmente essa não é a solução normal não. É mais fácil deixar a sessão morrer por tempo mesmo.

[quote=jakefrog]Ao fechar a página ela não envia nada para o servidor.

Você deveria fazer tipo um pop up que tem algum alguns sites perguntando: "vc quer realmente sair?.

Se o cara clicar ok, você poderia disparar uma chamada ajax.

Mas geralmente essa não é a solução normal não. É mais fácil deixar a sessão morrer por tempo mesmo.[/quote]

jakefrod,

É possível determinar um horário para que a aplicação encerre todas as sessões? Por exemplo: finalizar todas as sessões às 5:00 am?

Abraço.

[quote=max.analista][quote=jakefrog]Ao fechar a página ela não envia nada para o servidor.

Você deveria fazer tipo um pop up que tem algum alguns sites perguntando: "vc quer realmente sair?.

Se o cara clicar ok, você poderia disparar uma chamada ajax.

Mas geralmente essa não é a solução normal não. É mais fácil deixar a sessão morrer por tempo mesmo.[/quote]

jakefrod,

É possível determinar um horário para que a aplicação encerre todas as sessões? Por exemplo: finalizar todas as sessões às 5:00 am?

Abraço.[/quote]Que eu saiba, não.

jakefrog,

<session-config> <session-timeout>720</session-timeout> </session-config>

O tempo que eu determino para duração da sessão é por inactividade?
E por exemplo, se eu tenho um calculo dentro do meu sistema que ele demora cerca de 7 minutos. Se eu colocar o tempo da sessão em 6 minutos quando este processo entrar em execução a sessão será finalizada quando o cálculo terminar? ou quando estiver sendo executado este calculo o tempo não conta?

Cuidado com o 720 ali!
Esse valor é em minutos, ou seja, está com 720.

Eu eu imagino que seja após a reposta enviada. Ou seja, processa tudo e depois que manda a resposta conta o tempo definido no web.xml.

Obrigado jakefrog. Realizarei alguns testes aqui e dou um feedback neste post.
Minha preocupação seria em como esse tempo está sendo contado. Dependendo, se enquanto realizasse algum método no servidor e este tempo estiver sendo contado, eu teria a sessão finalizada sem antes do método fosse finalizado. Essa era minha preocupação e motivo dos 720.

Volto já com noticias :slight_smile:

Isso foi só um exemplo BEM hipotético né?
Você não está pensando em deixar o usuário esperando 7 minutos por uma resposta, está?

Uma prática interessante para esse controle de sessão é utilizar um mecanismo de “keep-alive”.

Dá uma olhada no código fonte da página aqui do guj e procure por “ping_session.jsp”

Um elemento escondido da página fica dando refresh sozinho, sem o usuário notar.
Se ele fechar o browser a sessão morre sozinha.
Daí você pode configurar no web.xml uma sessão curta de 2 minutos.

Na verdade eu nem conheço a aplicação toda.
Trabalho com sistema na area contabil. Estou passando de desktop pra web. É muito grande o sistema.
Imagino sim que tenha processo que demore pelo menos 5 minutos.

Outro sistema que demora na emissão de relatórios é o sistema do Inmetro. :wink: Mas esse já estou livre. hehe.

Galera, eu setei dessa forma no meu web.xml

<session-config> <session-timeout>5</session-timeout> </session-config>

Isso teria que fazer com que minha sessão seja finalizada em 5 minutos de inatividade. Estou correto?
A partir de quando que esse tempo é contado?
Estou implementando e não está sendo encerrado. Poderiam me dar um exemplo?

Não vou te dizer com certeza, porq eu nunca testei, mas em teoria a sessão é contada a cada request.
Assim, você entra na pagina x a sessão é aberta. se em 5 minutos (seu caso), o usuario ficar parado nessa pagina, sem dar nenhum request,ou seja nao realizar nenhuma ação que va ate o servidor e “renderize” a pagina, a sessão sera finalizada. manjou? mas eu repito, eu só sei a teoria, nao sei se essa pratica é REALMENTE assim.

Abraço.

[quote=angeliski]Não vou te dizer com certeza, porq eu nunca testei, mas em teoria a sessão é contada a cada request.
Assim, você entra na pagina x a sessão é aberta. se em 5 minutos (seu caso), o usuario ficar parado nessa pagina, sem dar nenhum request,ou seja nao realizar nenhuma ação que va ate o servidor e “renderize” a pagina, a sessão sera finalizada. manjou? mas eu repito, eu só sei a teoria, nao sei se essa pratica é REALMENTE assim.

Abraço.[/quote]

Poiis então angeliski, imaginei a mesma coisa que você. Se alguem poder me ajudar com materiais para leitura, agradeço.

Eu li sobre isso na apostila da k19:

http://www.k19.com.br/downloads/apostilas/java/k19-k12-desenvolvimento-web-com-jsf2-e-jpa2

Só que como eu disse, nao testei. A pagina 131 aborda isso, alem dos outros escopos.

Abraço!

Eu também estou procurando uma solução para isso.

Mas esse problema de colocar a sessão 5 segundos, é que ela perde a função original dela.

Eu tenho a sessão setada para expirar em 5 minutos, por exemplo, de inatividade do usuário.

Se o usuário ficar na página (deixar o browser aberto) e ir embora, essa sessão não vai expirar nunca (pq o frame escondido vai ficar pingando a sessão).

Eu preciso da sessão expirando em 5 minutos e que a sessão expire caso o browser seja fechado, até porque utilizo Certificado Digital. Ou seja, quando fechar o browser o usuário deva fazer um novo login.

Alguém tem uma ideia!?

Abraços!

[quote=mcosorio]Eu também estou procurando uma solução para isso.

Mas esse problema de colocar a sessão 5 segundos, é que ela perde a função original dela.

Eu tenho a sessão setada para expirar em 5 minutos, por exemplo, de inatividade do usuário.

Se o usuário ficar na página (deixar o browser aberto) e ir embora, essa sessão não vai expirar nunca (pq o frame escondido vai ficar pingando a sessão).

Eu preciso da sessão expirando em 5 minutos e que a sessão expire caso o browser seja fechado, até porque utilizo Certificado Digital. Ou seja, quando fechar o browser o usuário deva fazer um novo login.

Alguém tem uma ideia!?

Abraços![/quote]Sobre fechar o browser e matar a sessão já foi comentado aqui nesse post.

Se o cara deixar o browser aberto e o problema é o frame pingando direto. Você pode fazer um if no seu frame para identificar se o cara deixou a página aberta mas não esta clicando em nada ou executando nenhuma outra função.

[quote=jakefrog]Sobre fechar o browser e matar a sessão já foi comentado aqui nesse post.

Se o cara deixar o browser aberto e o problema é o frame pingando direto. Você pode fazer um if no seu frame para identificar se o cara deixou a página aberta mas não esta clicando em nada ou executando nenhuma outra função.[/quote]

De que forma seria esse IF?

Por exemplo, o usuário tem 5 minutos, teoricamente, pra preencher um formulario (antes que sua sessão expire), mas na verdade ele deixou o formulario aberto e foi passear…

Depois de 5 minutos, a aplicação tem que matar a sessão (por falta de interatividade/request). Mas com o ping, isso não vai acontecer…

Eu não entendi de que forma um IF vai solucionar esse caso. .

Agradeço a atenção! :slight_smile:

[quote=mcosorio][quote=jakefrog]Sobre fechar o browser e matar a sessão já foi comentado aqui nesse post.

Se o cara deixar o browser aberto e o problema é o frame pingando direto. Você pode fazer um if no seu frame para identificar se o cara deixou a página aberta mas não esta clicando em nada ou executando nenhuma outra função.[/quote]

De que forma seria esse IF?

Por exemplo, o usuário tem 5 minutos, teoricamente, pra preencher um formulario (antes que sua sessão expire), mas na verdade ele deixou o formulario aberto e foi passear…

Depois de 5 minutos, a aplicação tem que matar a sessão (por falta de interatividade/request). Mas com o ping, isso não vai acontecer…

Eu não entendi de que forma um IF vai solucionar esse caso. .

Agradeço a atenção! :slight_smile: [/quote]Do mesmo modo que esse ping funcionaria você poderia ter dentro da função registrado quando foi a ultima ação do cliente no browser. Caso passasse de 5min ao invés de mandar um ping, enviaria simplesmente uma chamada para logout. ^^

Entendi a sua lógica, e esse registro da última ação e chamada de logout, seria tudo via javascript, é isso?

Você tem um exemplo de como registrar a última ação do usuário? Não estou imaginando como seria…

Entendi a sua lógica, e esse registro da última ação e chamada de logout, seria tudo via javascript, é isso?

Você tem um exemplo de como registrar a última ação do usuário? Não estou imaginando como seria…

[/quote]Tenho não. faz muito tempo q não mexo com javascript.
Basta utilizar uma lógica de caso o usuário passe o mouse por cima da página vc altera uma variável date. e antes de dar o ping vc vê qual a hora do último movimento do usuário, se estourou 5min vc chama logout ao invés de um ping.

Mas se você configurar a sessão para 5 minutos e não colocar o iframe, ele já irá funcionar assim.

Ao fechar o browser e ele acessar o site novamente, a sessão no lado cliente não existirá mais, e ele terá que logar novamente.
Do lado servidor, essa sessão ficará órfã pelos cinco minutos e morrerá automaticamente após esse tempo.