Como invalidar uma sessão ao fechar o browser  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
Icecold
Thread.start()
[Avatar]

Membro desde: 30/03/2009 12:27:10
Mensagens: 27
Offline

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
[Email]
diegorc85
JavaBaby

Membro desde: 27/03/2007 18:07:11
Mensagens: 80
Offline

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

This message was edited 1 time. Last update was at 29/07/2009 15:48:19


MBA engenharia de software com ênfase em serviços SOA.
[MSN]
diegorc85
JavaBaby

Membro desde: 27/03/2007 18:07:11
Mensagens: 80
Offline

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");

}
//...
}

MBA engenharia de software com ênfase em serviços SOA.
[MSN]
fabim
GUJ Master
[Avatar]

Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline

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

ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται

Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao


[MSN]
jgbt
GUJ Master
[Avatar]

Membro desde: 04/06/2003 15:01:48
Mensagens: 1286
Localização: Porto Alegre/RS
Offline

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

João Bier
Desenvolvedor Java
[Email]
Icecold
Thread.start()
[Avatar]

Membro desde: 30/03/2009 12:27:10
Mensagens: 27
Offline

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
[Email]
gilson.anselmo
HelloWorld
[Avatar]

Membro desde: 30/07/2009 14:53:02
Mensagens: 11
Localização: São Paulo
Offline

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?

GILSON ARAUJO
GERENTE DE PROJETOS
msn: gilson_anselmo@hotmail.com
skype: gilson.anselmo
[MSN]
gutomantovani
Smalltalk
[Avatar]

Membro desde: 15/08/2008 13:54:44
Mensagens: 1
Offline

Icecold wrote: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
marceloplis
GUJ Ranger

Membro desde: 22/08/2005 10:08:21
Mensagens: 877
Localização: São Paulo - SP
Offline

Gelera,

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

Valew.
[Email] [MSN]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5748
Offline

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.
joaoorso
JavaTeenager
[Avatar]

Membro desde: 23/11/2006 21:48:55
Mensagens: 179
Localização: Curitiba - PR
Offline

1 Forma.
Mas nao funciona no Opera !



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

This message was edited 1 time. Last update was at 01/11/2011 11:11:37


João Ricardo Orso .
SCJP 5.0.
TSI

----------------------------------------------------------------
Os níveis de visibilidade do Java são: public, default, protected, private e " protected by Chuck Norris ", não tente acessar um atributo com este último modificador.


 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team