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.
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?
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.
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. Mas esse já estou livre. hehe.
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.
[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.
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.
[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. .
[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! [/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…
[/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.