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?
H
Hebert_Coelho
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.
M
max.analista
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
A
AbelBueno
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.
M
max.analista
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?
A
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.
M
max.analista
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.
Poiis então angeliski, imaginei a mesma coisa que você. Se alguem poder me ajudar com materiais para leitura, agradeço.
Só que como eu disse, nao testei. A pagina 131 aborda isso, alem dos outros escopos.
Abraço!
M
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!
H
Hebert_Coelho
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!
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.
M
mcosorio
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.
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!
H
Hebert_Coelho
mcosorio:
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.
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!
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. ^^
M
mcosorio
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…
H
Hebert_Coelho
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…
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.
A
AbelBueno
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.
M
mcosorio
POis é… seria ótimo se fosse assim… :?
Mas na prática, mesmo utilizando certificado digital, o usuário ta fechando o browser, abrindo uma nova janela e retorna a sessão normalmente…
Continua acessando as funcionalidades da aplicação. Como se nada tivesse acontecido.
A
AbelBueno
Isto é estranho.
Algumas perguntas:
Com qual browser está testando isso? Testou em vários?
O usuário realmente fecha todas as abas/janelas do browser antes de entrar no sistema?
(Se tiver alguma aba/janela aberta ele manterá a sessão)
Como você está criando a sessão?
M
mcosorio
AbelBueno:
Isto é estranho.
Algumas perguntas:
Com qual browser está testando isso? Testou em vários?
O usuário realmente fecha todas as abas/janelas do browser antes de entrar no sistema?
(Se tiver alguma aba/janela aberta ele manterá a sessão)
Como você está criando a sessão?
Mozilla Firefox 9.0.1. Não testei ainda em outro.
Eu mesmo testei fechando todas as janelas/abas existentes. Quando abre nova e passa a URL da aplicação não necessita do login…