es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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 en true, y proporcionar un bean vaadin.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.

Comments are closed.