繁体   English   中英

Session 复制与 VaadinSession 不工作

[英]Session replication with VaadinSession not working

我们有一个 web 应用程序,它使用 Spring Boot (1.5) 和 Vaadin (7.7),并使用 Apache Shiro (1.4) 来保证安全性。

应用程序配置为使用DefaultWebSessionManager让 Shiro 处理 session 管理而不是 servlet 容器。

我们使用的是官方的 Vaadin Spring 集成(1.2.0),经过一些配置,一切都按预期工作。 VaadinSession在内部包含一个包装ShiroHttpSession

我们希望通过将 Shiro 配置为使用由外部Cache支持的SessionDAO来实现 session 复制,这意味着会话得到(反)序列化。

一旦我们开始使用这个SessionDAO ,Vaadin 就会崩溃并停止工作。 当为了调试而用 memory Map中的一个替换外部缓存时,它又可以工作了。

这似乎是由SpringVaadinServlet引起的,因为它将VaadinSession存储为 session 属性。 VaadinSession是可Serializable的,Javadoc 显示:

VaadinSession 中的所有内容都应该是可序列化的,以确保与使用序列化来持久化 session 数据的方案兼容。

VaadinSession内部是一些不可Serializable的字段,例如Lock和包装的 http session 内部也标记为瞬态。

正因为如此,Vaadin 使用的 session 一经分发就会坏掉,导致大量崩溃。

所以事实证明VaadinSession在 session 复制中实际上是不可用的? 为什么会这样,我们如何解决这个问题?

注意:我们还有一个使用 Vaadin 8 的应用程序版本,这里也会发生同样的事情。 该问题似乎是由 Vaadin Spring 集成引起的。

VaadinSession 内部是一些不可序列化的字段,例如 Lock 和包装的 http session 内部也标记为瞬态。

The wrapped http session is not part of Vaadin session, it is the the http session. 因此它是短暂的。 Lock也是如此,它的实例存储在http session中。

为了正确实现 session 序列化,您需要挂钩序列化事件并在 session 被反序列化时更新瞬态。 VaadinSession应该使用VaadinService#loadSession加载,它调用VaadinSession#refreshTransients

VaadinSession 中的所有内容都应该是可序列化的,以确保与使用序列化来持久化 session 数据的方案兼容。

此声明并不意味着您可以开箱即用地序列化您的应用程序。 这只是意味着,如果您的应用程序也是可序列化的,那么通过仔细的工程设计,您可以序列化整个事物。

例如,出于性能原因,Vaadin 不会在每个可能的情况下更新 session 属性。 有方法VaadinService#storeSession 因此,您需要覆盖正确的方法或设置请求过滤器。 例如,您可以在VaadinService#endRequest执行此操作。

请注意,您需要使用粘性会话才能以适度的努力使其正常工作。 如果您的 session 在不同的机器上被反序列化,则重入锁实例将无效。 如果您希望能够在不同的机器上反序列化 session,则需要您的基础架构可以提供可以使用的分布式锁,而不是 Java 的重入锁,并覆盖 Vaadin 的getSessionLocksetSessionLock方法来使用它。

进一步信息的宝贵来源:

Vaadin 首席技术官的一般说明

https://vaadin.com/blog/session-replication-in-the-world-of-vaadin

使用一个堆栈完成的开发人员的推荐信

https://vaadin.com/learn/tutorials/hazelcast

另一位高级开发人员的想法

https://mvysny.github.io/vaadin-14-session-replication/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM