quinta-feira, 6 de outubro de 2011

Mais de uma aplicação em um web container

A algum tempo, tenho trabalhado em um projeto WEB com Java semelhante a um portal. Neste portal, as aplicações são executadas em um mesmo container (que pode ser "clusterizado"). Para a construção deste portal, podemos ter alguns iframes que chamam aplicações distintas. Alguns problemas ocorreram durante o desenvolvimento, e um destes problemas merece uma pequena atenção.

Imagine um problema intermitente onde algumas vezes uma aplicação em um frame funciona e no outro frame não funciona. Mas se tivermos apenas um frame a aplicação que não funcionava passa a executar perfeitamente.

Tentei realizar vários debugs, sincronizar o acesso a alguns componentes da aplicação, mas nada adiantava. Não conseguia achar a fonte do problema. Porém, um colega de trabalho sugeriu instalar o Tomcat 7 e alterar o nome do atributo JSESSIONID do cookie de sessão para JSESSIONID_nome_da_app. Eu achei que tinha entendido o problema, porém somente após ler os textos descritos abaixo a situação ficou totalmente clara para mim.

  • Problema apontado pela IBM quando se utiliza o mesmo nome do atributo JSESSIONID para o cookie de sessão:

    "The session cookie ID for Lotus Connections is named JSESSIONID by default. Other products hosted by the WebSphere Application Server often use the same name for their session cookie. If IBM HTTP Server is hosting multiple web servers, you might want to change the cookie name of one of them to prevent the cookie from being lost when the user is redirected from one product to another."
    Link: mais detalhes


  • Alteração na JSR-000315 para Servlet 3.0 permite esta alteração no nome do jsessionid.
    "The standard name of the session tracking cookie must be JSESSIONID,
    which must be supported by all 3.0 compliant containers. Containers may allow the
    name of the session tracking cookie to be customized through container specific
    configuration."

    Referência: session 7.1.1 - Cookies from JSR-000315 Java Servlet 3.0 Final Release




Moral da história: se temos mais de uma aplicação rodando no mesmo container web sendo que cada uma é apresentada na mesma página, teremos respostas com jsessionid definidos com diferentes valores/ids. No final das contas, o cookie armazenado no browser poderá ser sobrescrito pela resposta da última aplicação carregada no browser anulando o id da primeira aplicação que fora carregada.

Para resolver isso, basta usarmos o recurso que permite alterar o nome do jsessionid sendo cada um diferente para cada aplicação.

Isso pode ser muito óbvio para alguns, porém eu não tinha isso bem claro ainda. Talvez possa ajudar mais alguém algum dia.

Nenhum comentário:

Postar um comentário