Como invalidar uma sessão ao fechar o browser

11 respostas
I

Boa tarde galera.
Estou com uma tremenda dúvida: é possível invalidar uma sessão ao fechar a janela do browser? Digo isso pois tenho um pequeno aplicativo, com filtro e tudo funciona perfeitamente. Adicionei um botão para efetuar um logout e tudo funciona muito bem, invalidando a sessão perfeitamente. Agora vêm as complicações: se eu clicar no botão voltar do browser, retorno para a tela do sistema. Não é possível fazer nada pois o filtro intercepta que não há sessão e redireciona para a tela de login. Primeira pergunta: como evitar que ao clicar no botão voltar do browser me exiba que a página expirou?
Depois de logado, se eu fechar a janela do browser, eu queria que também se encerrasse a sessão. Mas acontece que, após fechar a janela, se abri-la depois e digitar a url, eu acesso o sistema com todas as funcionalidades. Segunda pergunta: como invalidar esta sessão ao fechar o browser?

Obrigado

11 Respostas

D

Qdo clicar no botão fechar, tenta fechar o browser tbm. Tive um problema parecido e só consegui resolver fazendo isso!!
tenho um post com informações q pode ajudar tbm

http://www.guj.com.br/posts/list/47107.java

D

tenho tbm outra dica..
[code]public class Filtro implements Filter {

private FilterConfig config = null;
private ServletRequest req;
private ServletResponse res;

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
//passa valores para variáveis globais:
this.req = req;
this.res = res;

HttpSession session = ((HttpServletRequest)req).getSession();

String testa = (String)session.getAttribute("permission");

if(testa=="allow"){
chain.doFilter(req, res);
}else{
((HttpServletResponse)res).sendRedirect("../index.jsp");
}

}

}
e depois tenho mais essa servlet para controle do Logoff
public class Logoff extends HttpServlet {

//...
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

HttpSession session = request.getSession();
session.invalidate();

((HttpServletResponse)response).sendRedirect("index.jsp");

}
//...
}

F

O velho problema do botao voltar (aka botao fechar ‘X’)

Essas coisas acontecem no cliente e sao dificies de lidar, pois vc nao consegue controlar isso no servidor…

Tenta usar o metodo history do javascript, passando -1… isso vai fazer que qdo o cara clique no voltar, seja jogado de novo para a pagina no qual ele clicou no botao voltar.

Mas isso nao RESOLVE o problema, só minimiza.

Abraços

J

Vamos por partes.

Botão Voltar:
Faça como foi sugerido, coloque um history(1) nas paginas. Se o usuario clicar no voltar, ele volta, mas ao encontrar esse comando vai navegar de volta p/ pagina de origem.

Encerrar a sessao quando fechar o browse:
2 maneiras de fazer:
1- Vc pode capturar o click no fechar do browser(pelas coordenadas) e faazer com que app seja redirecionada para seu logout.
2 - Defina um timeout pequeno para a sessão, tipo 10 segundos. Faca um IFrame oculto nas telas que fique fazendo pooling no servidor de 5 em 5 segundos por exemplo para ficar renovando a sessao. Quando o browser for fechado, não havera pooling e em 10 segundos a sessao expira.

Ja postei essas soluções no forum, da uma procurada.

[]´s

I

Inseri o history(1) e funcionou em partes: ao clicar no botão voltar não me redireciona mais para a página anterior mas acontece que quando tento novamente logar no sistema, tenho o erro javax.faces.application.ViewExpiredException que a sessão expirou. Para resolver este contratempo, é necessário dar um refresh na página e volta tudo ao normal. Há como evitar este erro?
Quanto a invalidar a sessao ao fechar o broser não encontrei o post. Alguem poderia me passar o link.
Mais uma vez obrigado pessoal

G

Pessoal

Não conheço muito de jsp/servlets, mas também não daria para abrir o browser sem os botos de avançar e back? utilizando javascript?

foi apenas uma idéia o que voces acham?

G

Icecold:
Inseri o history(1) e funcionou em partes: ao clicar no botão voltar não me redireciona mais para a página anterior mas acontece que quando tento novamente logar no sistema, tenho o erro javax.faces.application.ViewExpiredException que a sessão expirou. Para resolver este contratempo, é necessário dar um refresh na página e volta tudo ao normal. Há como evitar este erro?
Quanto a invalidar a sessao ao fechar o broser não encontrei o post. Alguem poderia me passar o link.
Mais uma vez obrigado pessoal

Cara vc tem que usar history(-1) e não history(1)… vc está dando um avançar… e não um voltar desta forma

M

Gelera,

Alguém achou o link ou uma outra solução para invalidar a sessao ao fechar o browser ?

Valew.

E

Se você percebeu. o site do GUJ usa a seguinte técnica: um JSP bem boboca (http://www.guj.com.br/ping_session.jsp) que tem um tag refresh de 60 segundos. Esse JSP é acionado de um IFRAME escondido. (Dê um view source nesta página do GUJ).

Então você pode criar algo parecido: uma página JSP que verifique se um determinado usuário está logado. Quando essa página parar de ser chamada periodicamente para um determinado usuário, provavelmente o browser foi fechado. Agora é questão de pensar como você pode aproveitar essa informação.

J

1 Forma.
Mas nao funciona no Opera !

window.onbeforeunload = function() {						
							jQuery('#formLogoff').submit();	
							alert("Você saiu do chat.");		
							//sleep(5000);
						}		


				<form action="<%=request.getContextPath()%>/finalizarChat.jsp" id="formLogoff">
					<input type="hidden" name="salaNome" value="<%=salaNome%>">
				</form>

Vou mudar para essa 2ª forma que o jgbt falou .

A

Olá jgbt,

Você tem um exemplo de como fazer isso com o Iframe?

Criado 29 de julho de 2009
Ultima resposta 15 de jun. de 2012
Respostas 11
Participantes 10