java - servlet - tomcat home page




¿Alguna forma de compartir estado de sesión entre diferentes aplicaciones en tomcat? (6)

Desarrollé el servidor de estado de sesión para tomcat usando python.

Debido a esto, no necesito cambiar el código ya escrito para crear / acceder y destruir la sesión. Además, hay un servidor / servicio separado que está manejando y almacenando la sesión, por lo que no se necesita el clúster maestro. No hay replicación de la sesión (como en la agrupación de tomcat) en este caso, más bien se trata de compartir la sesión entre la agricultura web.

Queremos dividir una aplicación en funcionamiento en dos archivos .war diferentes para poder actualizar una aplicación sin afectar a la otra. Cada aplicación web tendrá una interfaz de usuario diferente, usuarios diferentes y un calendario de implementación diferente.

La ruta más fácil parece estar compartiendo la misma sesión, por lo que si la aplicación A establece la aplicación B de session.setAttribute("foo", "bar") podrá verla.

¿Hay alguna forma de compartir el estado HttpSession para ambas aplicaciones en la misma instancia de Tomcat?

Nuestra aplicación se ejecuta en un Tomcat 5.5 dedicado, no hay otras aplicaciones ejecutándose en la misma instancia de tomcat, por lo que cualquier problema de seguridad con respecto a la sesión compartida no es un problema. Estamos ejecutando varias instancias de Tomcat, pero el equilibrador está utilizando sesiones adhesivas.

Si no es posible o si compartir esta sesión es una mala idea, por favor deje un comentario.


No debe dividir su aplicación de esa manera en orden por tener alta disponibilidad. Puede implementar toda la aplicación en muchas instancias de tomcat.


Puede hacerlo tomando el contexto de servlet por su raíz de contexto.

Para recuperar variables

request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute(variableName)

Para establecer la variable:

request.getSession().getServletContext().getContext("/{applicationContextRoot}").setAttribute(variableName,variableValue)

Nota: Ambas aplicaciones deberían implementarse en el mismo servidor.

Por favor, hágamelo saber si encuentra algún problema



Tomcat 8: tuve que hacer: <Context crossContext="true" sessionCookiePath="/"> en conf / context.xml

más detalles sobre los atributos de configuración here

y luego establecer el valor (como la respuesta de @ Qazi):

ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath")
servletContext.setAttribute(variableName,variableValue)

para obtener el valor:

ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath")
servletContext.getAttribute("user"); 

Una cosa a tener en cuenta es que dos aplicaciones web utilizarán diferentes cargadores de clases. Si quieres compartir objetos, ellos necesitan usar la misma versión de la clase del mismo cargador de clases (o de lo contrario obtendrás LinkageErrors). Eso significa ponerlos en un cargador de clases compartido por ambas aplicaciones web (por ejemplo, ruta de clases del sistema) O usar la serialización para drenar y reconstituir efectivamente el objeto en el cargador de clases correcto con la versión correcta de la clase.





java-ee