Vi vários desenvolvedores procurando uma solução para esse problema: acessando informações da sessão de um WAR diferente (mesmo quando dentro do mesmo EAR) - aqui estão alguns exemplos: Alguma maneira de compartilhar o estado da sessão entre aplicativos diferentes no tomcat? , Sessão de acesso de outro aplicativo da web , arquivos WAR diferentes, recursos compartilhados , Tomcat: Como compartilhar dados entre dois aplicativos? , O que o atributo crossContext faz no Tomcat? Ele permite o compartilhamento de sessões? e assim por diante...
De tudo que procurei, existem algumas soluções específicas, dependendo do contêiner, mas é de alguma forma ' contrário à especificação '. Também examinei a especificação Java EE sem nenhuma sorte em encontrar uma resposta.
Alguns desenvolvedores falam sobre o acoplamento entre aplicativos da Web, mas eu discordo. Qual é o motivo pelo qual os WARs manteriam o WAR dentro do mesmo EAR, se não estiverem acoplados? Os EJBs, por exemplo, podem ser acessados localmente (mesmo que dentro de outro EJB JAR dentro do mesmo EAR).
Mais especificamente, um dos meus WARs lida com autenticação e autorização, e eu gostaria de compartilhar essas informações com outros WARs (no mesmo EAR). Eu já consegui solucionar problemas semelhantes antes, empacotando WARs como JARs e colocando-os em um projeto WAR único (WEB-INF / lib). No entanto, eu não gosto dessa solução (ela requer um grande esforço na nomeação de servlets e assim por diante).
E nenhuma solução respondeu à primeira (e mais importante) pergunta: Por que os WARs não podem compartilhar informações da sessão?
fonte
Respostas:
Trate um EAR como uma máquina pseudo-virtual
Um EAR é simplesmente uma coleção de arquivos WAR que compartilham configurações e bibliotecas comuns, geralmente de JARs. Isso permite que uma coleção de serviços interdependentes seja gerenciada mais facilmente em um contêiner de aplicativo. Assim, você pode pensar em um EAR como uma forma simples de máquina virtual, uma vez que é implantada em seu contêiner.
Da mesma maneira que um processo em uma máquina virtual não pode afetar outro, o mesmo se aplica a um EAR. Todos os WARs são isolados para proteger seu estado interno.
Escalando autenticação
Em geral, os aplicativos da web precisam ser sem estado para dimensionar bem. Ter muitas informações na sessão é um antipadrão que impede isso. Isso leva a um conflito entre a natureza apátrida do HTTP e a necessidade de manter uma experiência rápida e personalizada do usuário. A autenticação é um caso de uso clássico e prevalece nas APIs de bate-papo que exigem muitas solicitações autenticadas para fornecer funcionalidade ao usuário final.
O Logon único e o Logoff único precisam de uma sinalização cuidadosa para funcionar corretamente (considere o Logoff parcial), principalmente quando a escala horizontal está em vigor. Simplesmente compartilhar o estado da sessão quase nunca é uma boa solução e uma abordagem melhor é usar um único ponto de referência para as informações do usuário às quais todos os nós no cluster têm acesso.
A concentração no acesso rápido e em cache às informações relevantes produzirá resultados muito mais escaláveis do que alguma solução complexa e frágil de compartilhamento de sessões.
fonte
Acho que falta alguma funcionalidade na especificação JEE EAR - a capacidade de compartilhar sessões da web entre vários arquivos da web vinculados a um EAR.
Servidores de aplicativos como o Weblogic têm implementações não padrão para essa funcionalidade.
fonte
Bem, AFAIKS, não há nenhuma razão real para você querer fazer isso. Um WAR é um aplicativo da web independente, com escopos próprios (específicos do aplicativo da web) (como o escopo da sessão). Se você precisar compartilhar a funcionalidade (código Java, páginas JSP, arquivos CSS), entre vários WARs, você terá a opção muito mais sensata de empacotá-los como arquivos JAR e implementá-los em seu servidor de aplicativos. Um pacote WAR é uma solução de empacotamento mais complexa e projetada para encapsular algo diferente do simples "código / funcionalidade comum". O JAR é um formato mais simples e foi projetado para empacotar e compartilhar código e funcionalidade. Por que você deseja usar um pacote mais complexo e não especificamente projetado para esse compartilhamento para compartilhar algo, quando você já possui um formato de pacote mais simples e mais adequado a esse pacote?
fonte
Acho que isso foi feito de propósito, para evitar que diferentes aplicativos da Web substituam acidentalmente as informações da sessão uns dos outros. Pode ser útil no seu caso, mas, em geral, você não deseja que os usuários causem falha no aplicativo ou aumentem seus privilégios apenas porque eles usam dois aplicativos da Web ao mesmo tempo. Não é exatamente difícil compartilhar informações explicitamente entre aplicativos da Web; basta criar uma classe com um HashMap estático, usar GUIDs como chaves e transferi-las como parte do parâmetro URL ou HTTP.
fonte