Thursday, April 02, 2009

JSessionId em múltiplos contextos

Quando 2 aplicações dentro de um mesmo host/domínio usam sessão, se permitido, um cookie que armazena o jsessionid será gerado na maquina do cliente. Apenas um cookie ja que a criação é por dominio e não por contexto. Aparentemente nenhum problema, mas isso pode gerar um comportamento estranho e difícil de identicar.

No server-side (container) para as 2 aplicações teremos 2 instâncias de HttpSession um por contexto, da forma que deve ser. O jboss sabe mapear a request com o HttpSession do contexto correto, sem problemas.

Mas e se ...? O problema:
  • A aplicação X, com o erro intermitente, tem um time-out de session de 5 minutos.
  • X possui uma tela faz busca em outro contexto, a aplicação Y.
  • O host de Y eh o mesmo de X, e o seu time-out é de 2 minutos por exemplo.
  • O usuario ao autenticar em X e abrir a tela que aciona Y, sem saber possui 2 sessions, uma para cada aplicação, mas somente um cookie!
  • Caso o usuário depois ficasse 2 minutos trocando uma idéia no msn ou tomando um cafézinho, ao voltar pra tela que aciona Y, uma nova session seria gerada, que a anterior expirou. Nova session, novo jsessionid, novo cookie!
  • Ao fazer uma request para X, o container ira receber um jsessionid desconhecido para o contexto, e ai adivinha? Session "perdida".

Ficamos quase uma semana de cabelo em , para descobrir o porque do "sumiço" da session Demorou pra se ligar nesse detalhe.

No comments: