Olá pessoal…
tenho um problema que tem se demonstrado um grande desafio de solução. Até implaquei uma, mas se demonstrou muito instável. No próximo post, colocarei essa solução.
O problema em questão é gerenciar uma sessão JSF com funções ligadas diretamente ao cliente (browser).
Mas porque gerenciar essa sessão? Esta pergunta é válida pois se não existe um porque, não exite também o problema, não é mesmo?
Muito bem. Muitas aplicações não tem um gerenciamento sólido pelos movimentos do cliente. O que elas têm é um simples timeout configurado no tomcat, que após esse tempo, o tomcat mata a sessão em jogo. Quando faz isso, destrói objetos de sessão e limpa endereços de memória no servidor ligados àquela sessão. Assim, como num toque de mágica, a máquina tomcat faz o gerenciamento pra você e você não precisa se preocupar com session.invalidate() em qualquer momento. Aplicações assim costumam ter objetos e atributos de sessão que não comprometem mais do que memória RAM.
No entanto, quando se tem atributos de sessão como conexão de banco de dados que é gerenciada manualmente por você mesmo, é preciso, em algum momento, declarar o fechamento dessa conexão. A pergunta é: ‘quando’? A resposta é fácil: ‘Quando a sessão acaba.’ Isso, por tempo ocioso no tomcat acontece automaticamente. Mas imagine que você tenha um grande número de acessos e conexões no servidor, que por sua vez requer que essas conexões sejam destruídas o mais rápido possível. Então uma solução, um meio de matar a sessão é colocar um botão na aplicação com o Label: ‘SAIR’, que mata as sessões. Mas e se o usuário não clicar em sair e apertar o botão de fechar do browser? --> a sessão continua e a conexão também. Mas então colocamos no evento onunload da pagina para chamar, através de AJAX, um método para matar a sessão. Mas o problema é que quando você submitar a página, ou apertar o botão de voltar no browser, também vai matar a sessão, e se você estiver gerenciando a aplicação por um phaselistener que redireciona para login se a sessão estiver nula, então sempre vai redirecionar para login.
Parece até um beco sem saída, algo extraordinariamente chato. ehhehe
A minha pergunta para os programadores JAVA desse portal é: "Existe uma maneira de matar a sessão logo após o clique no botão de fechar do browser?"
Ainda eu não descobri uma solução que fosse estável, nem mesmo consegui em grandes fórums pela internet resposta para isso. O que muita gente me referenciou foram alguns codigos javascript do tipo: clique aqui, faça isso, use esse browser e seja feliz. Mas eu quero uma solução bonita. Se usar javascript para pegar o clique do botao de fechar, então que sirva para todos os browsers ( ou os mais importantes). Os códigos que já verifiquei servem para IE, mas não para firefox. Isso ocorre pelo DOM do IE ser diferente do firefox.
Fica a pergunta… será que existe? será?
(abaixo uma solução instável)