Como invalidar uma sessão ao fechar o browser

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

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

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");   
       
}   
//...   

}

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

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

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

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?

[quote=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[/quote]

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

Gelera,

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

Valew.

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.

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 .

Olá jgbt,

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