He visto a varios desarrolladores que buscan una solución para este problema: acceder a la información de sesión desde un WAR diferente (incluso dentro del mismo EAR). Aquí hay algunos ejemplos: ¿ Alguna forma de compartir el estado de sesión entre diferentes aplicaciones en Tomcat? , Sesión de acceso de otra aplicación web , diferentes archivos WAR, recursos compartidos , Tomcat: ¿Cómo compartir datos entre dos aplicaciones? , ¿Qué hace el atributo crossContext en Tomcat? ¿Permite compartir sesiones? y así...
De todo lo que he buscado, hay algunas soluciones específicas que dependen del contenedor, pero de alguna manera es ' contrario a la especificación '. También he examinado las especificaciones de Java EE sin suerte en encontrar una respuesta.
Algunos desarrolladores hablan sobre el acoplamiento entre aplicaciones web, pero tiendo a estar en desacuerdo. ¿Cuál es la razón por la que uno mantendría los WAR dentro del mismo EAR si no se acoplan? Se puede acceder a los EJB, por ejemplo, localmente (incluso dentro de otro JAR EJB dentro del mismo EAR).
Más específicamente, uno de mis WAR maneja la autenticación y la autorización, y me gustaría compartir esta información con otros WAR (en el mismo EAR). Me las arreglé para solucionar problemas similares antes empaquetando WAR como JAR y colocándolos en un proyecto WAR singular (WEB-INF / lib). Sin embargo, no me gusta esta solución (requiere un gran esfuerzo para nombrar servlets, etc.).
Y ninguna solución ha respondido a la primera (y más importante) pregunta: ¿por qué los WAR no pueden compartir información de la sesión?
fuente
Respuestas:
Tratar un EAR como una máquina pseudo-virtual.
Un EAR es simplemente una colección de archivos WAR que comparten una configuración y bibliotecas comunes, generalmente de JAR. Esto permite que una colección de servicios interdependientes se administre más fácilmente dentro de un contenedor de aplicaciones. Por lo tanto, puede pensar en un EAR como una forma simple de máquina virtual una vez que se implementa en su contenedor.
De la misma manera que un proceso en una máquina virtual no puede afectar a otro, lo mismo es cierto para un EAR. Todas las guerras están aisladas para proteger su estado interno.
Autenticación de escala
En general, las aplicaciones web deben ser apátridas para escalar bien. Tener mucha información en la sesión es un antipatrón que lo impide. Esto lleva a un conflicto entre la naturaleza sin estado de HTTP y la necesidad de mantener una experiencia de usuario rápida y personalizada. La autenticación es un caso de uso clásico, y prevalece en las API de conversación que requieren muchas solicitudes autenticadas para ofrecer la funcionalidad del usuario final.
El inicio de sesión único y el cierre de sesión único necesitan una señalización cuidadosa para funcionar correctamente (considere cerrar sesión parcialmente), particularmente cuando se aplica la escala horizontal. Simplemente compartir el estado de la sesión casi nunca es una buena solución y un mejor enfoque es utilizar un único punto de referencia para la información del usuario a la que tienen acceso todos los nodos del clúster.
Concentrarse en el acceso rápido en caché a la información relevante producirá resultados mucho más escalables que alguna solución compleja y frágil para compartir sesiones.
fuente
Creo que falta la funcionalidad de la especificación JEE EAR: la capacidad de compartir sesiones web en varios archivos web vinculados dentro de un EAR.
Los servidores de aplicaciones como Weblogic tienen implementaciones no estándar para esta funcionalidad.
fuente
Bueno, AFAIKS, no hay una razón real por la que te gustaría hacer esto. Un WAR es una aplicación web autónoma, con sus propios ámbitos (específicos de la aplicación web) (como el alcance de la sesión). Si necesita compartir funcionalidad (código Java, páginas JSP, archivos CSS), entre múltiples WAR tiene la opción mucho más sensata de empaquetarlos como archivos JAR e implementarlos en su servidor de aplicaciones. Un paquete WAR es una solución de empaque más compleja y está diseñada para encapsular algo diferente a un simple "código / funcionalidad común". El JAR es un formato más simple Y está diseñado para empaquetar y compartir código y funcionalidad. ¿Por qué desearía utilizar un paquete más complejo y no diseñado específicamente para ese producto para compartir algo, cuando ya tiene disponible un formato de paquete más simple y más adecuado para ese paquete?
fuente
Creo que esto se hizo a propósito, para evitar que diferentes aplicaciones web sobrescriban accidentalmente la información de la sesión de los demás. Puede ser útil en su caso, pero en general, no desea que los usuarios bloqueen la aplicación o escalen sus privilegios solo porque usan dos aplicaciones web al mismo tiempo. No es exactamente difícil compartir explícitamente información entre aplicaciones web; simplemente cree una clase con un HashMap estático, use GUID como claves y transfiéralos como parte de la URL o el parámetro HTTP.
fuente