Problemas com sessão

4 respostas
A

Olá a todos.

Estou com um problema que está me tirando o sono. Tudo indica ser algum problema no gerenciamento das sessões, mas não consigo descobrir como ou onde.

Oferecemos um serviço via web aos nossos clientes (para que façam alterações nos serviços contratados). Na gigantesca parcela dos casos, não temos qualquer problema, mas para uma pequena parcela, nós temos. E o que acontece é um tanto misterioso:

Dá uns erros durante a utilização do sistema, com o lançamento uma NullPointerException quando chamava algum método de variáveis que deveriam estar carregadas. Com o passar dos casos, notei que tais erros sempre ocorriam em relação à variáveis recuperadas da sessão. Tratei de fazer o seguinte, quando dava o tal erro fazia a página mandar um e-mail para mim com mais informações, uma dessas informações é o conjunto de attributos da minha sessão (nome e valor) fiz isso com session.getAttributeNames(), depois com um laço pego as variáveis e seus valores e mando tudo por e-mail.

Entretanto, tive a surpresa de descobrir que quando dava erro alguns atributos que deveriam estar carregados não estão. Quando digo, deveriam é no sentido que deveriam mesmo… rs… Para isso vou explicar melhor como o sistema funciona.

O usuário faz login, na página que valida o login, alguns dados importantes são criados na sessão com session.setAttribute, então a página é redirecionada à um “menu” onde o cliente faz as alterações que quer. Ocorre que quando dá erro (e só dá erro no cliente, quando acesso da minha rede usando seu login fica tudo redondinho) alguns dos atributos setados na primeira página não existem mais na segunda. Já pesquisei em todas as páginas do site. Em nenhum lugar estou usando session.removeAttribute ou session invalidate(). Não há também qualquer desvio (if) que justifique um atributo estar carregado e outro não. Se executar o SQL que retorna dos dados que serão jogados na sessão, eles retornam valores diferentes de NULL e em alguns casos nem poderia ser diferente, já que são PK’s de tabela.

Já alterei minha chamada que era response.sendRedirect("menu.jsp"); para response.sendRedirect(response.encodeRedirectURL("menu.jsp"));, mas não tive sucesso. Não sei mais o que fazer, gostaria que me ajudassem.

Muito Obrigado.

Anderson Costa
São Paulo - SP

4 Respostas

F

Você ja experimentou adicionar um HttpSessionAttributeListener para verificar quando e onde o atributo está sendo “removido” ?

http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpSessionAttributeListener.html

http://www.java2s.com/Code/Java/Servlets/Servletsessionattributelistener.htm

Fred

A

Vou ver o que consigo, mas se tiverem outras disca agradeço muito, pois recebemos muitos acessos diários à este site (± 500), e ficar verificando log de todas essas sessões, não vai ser nada fácil.

F

Verifique somente os dados que devem obrigatoriamente estar na sessão.

A

Fre_d, muito obrigado pela dica, foi muito util. Eu fiz um pouquinho diferente do que você sugeriu.

Verifiquei todos os dados que coloco na sessão, mas subi em outro site e pedi que alguns dos clientes qeu tiveram problemas acessassem para que eu fizesse testes. No primeiro momento achei que não daria em nada, já que todos eles conseguiram fazer o que queriam no sistema onde eu havia colocado o listener, mas um detalhe me chamou a atenção, quando a sessão expira, diferente do que eu imaginava, os dados da sessão demoram para ser retirados, na verdade o tomcat (por algum motivo que não sei) só remove de 3 à 4 atributos por segundo (eu imaginava que demorassem alguns ms para limpar tudo). Sei que parece história de holliwood, mas acredito que o tomcat começava a limpar a sessão do cara, mas aí recebia alguma requisição e parava, só que nesse meio tempo alguns dados já haviam sido exlcuídos da memória… fiz algumas alterações que fazem com que a sessão não expire enquanto o cara estiver com o browser aberto (de tempos em tempos - antes de espriar a sessão - a página vem no servidor e diz “olá, ainda estou aqui”). Com isso não tive mais nenhum problema…

Agora só a título de curiosidade, alguém sabe dizer proquê não demora somente alguns mili e sim alguns segundos para que todos os dados da sessão sejam jogados fora?

Obrigado pela colaboração,

Anderson Costa
São Paulo - SP

Criado 10 de julho de 2007
Ultima resposta 13 de jul. de 2007
Respostas 4
Participantes 2