La replicación de sesión con VaadinSession no está funcionando.
Tenemos una aplicación web que usa Spring Boot (1.5) con Vaadin (7.7) y usa Apache Shiro (1.4.0) para seguridad.
La aplicación está configurada para usar DefaultWebSessionManager
para que Shiro maneje la gestión de sesión en lugar del contenedor de servlets.
Estamos usando la integración oficial de Vaadin Spring (1.2.0) y después de alguna configuración, todo funciona como se esperaba. VaadinSession
contiene un ShiroHttpSession
integrado.
Queremos lograr la replicación de sesión, configurando Shiro para que use un SessionDAO
respaldado por una Cache
externa. Eso significa que las sesiones se (des)serializan.
Tan pronto como comenzamos a usar este SessionDAO
, Vaadin se bloqueará y dejará de funcionar. Cuando reemplazamos la caché externa por un Map
en memoria por fines de depuración, funciona de nuevo.
Parece que esto es causado por SpringVaadinServlet
ya que almacena VaadinSession
como un atributo de sesión. VaadinSession
es Serializable
y el Javadoc muestra:
Todo dentro de una VaadinSession debe ser serializable para garantizar la compatibilidad con los esquemas que utilizan serialización para persistir los datos de sesión.
Dentro de VaadinSession
hay algunos campos que no son Serializable
, como un Lock
y también se marca como transitorio la sesión http envuelta dentro.
Debido a esto, la sesión que usa Vaadin se romperá tan pronto como se distribuya, lo que resulta en muchos fallos.
Entonces resulta que VaadinSession
no es realmente utilizable en la replicación de sesión. ¿Por qué es esto y cómo podemos solucionarlo?
Nota: también tenemos una versión de la aplicación que usa Vaadin 8, y aquí ocurre lo mismo. Parece que el problema es causado por la integración de Vaadin Spring.
davy.ai
Respuesta
Sí, parece que
VaadinSession
no es completamente compatible con la replicación de sesiones, debido a algunos campos no serializables y la sesión http envuelta transitoriamente.Para solucionar este problema, puedes intentar implementar un
SessionSerializer
personalizado para Vaadin, que se encargará de serializar/deserializar la sesión de Vaadin. Este serializador debe manejar correctamente los campos no serializables, por ejemplo, ignorándolos o utilizando una lógica de serialización personalizada.Para utilizar este serializador personalizado, puedes modificar la configuración de Vaadin Spring para establecer la bandera
vaadin.servlet.productionMode
entrue
, y proporcionar un beanvaadin.servlet.sessionSerializationStrategy
que utilice tu serializador personalizado.Alternativamente, puedes intentar utilizar un sistema de gestión de sesiones diferente que sea completamente compatible con la replicación de sesiones, como Spring Session. Spring Session proporciona una variedad de opciones de gestión de sesiones, incluyendo replicación basada en Redis y persistencia basada en JDBC, e integra bien con Spring Boot y Vaadin.