【发布时间】:2022-01-03 14:08:46
【问题描述】:
我们有一个使用 Spring Boot (1.5) 和 Vaadin (7.7) 的 Web 应用程序,并使用 Apache Shiro (1.4.0) 来保证安全性。
应用程序被配置为使用DefaultWebSessionManager 让 Shiro 处理会话管理而不是 servlet 容器。
我们使用的是官方的 Vaadin Spring 集成 (1.2.0),经过一些配置后,一切都按预期工作。 VaadinSession 在内部包含一个包装的 ShiroHttpSession。
我们希望通过将 Shiro 配置为使用由外部 Cache 支持的 SessionDAO 来实现会话复制,这意味着会话被(反)序列化。
一旦我们开始使用这个SessionDAO,Vaadin 就会崩溃并停止工作。当为了调试而用内存中的Map替换外部缓存时,它又可以工作了。
这似乎是由SpringVaadinServlet 引起的,因为它将VaadinSession 存储为会话属性。 VaadinSession 是 Serializable,Javadoc 显示:
VaadinSession 中的所有内容都应该是可序列化的,以确保 与使用序列化来持久化的方案的兼容性 会话数据。
VaadinSession 内部是一些不是Serializable 的字段,例如Lock,并且其中封装的 http 会话也被标记为瞬态。
因此,Vaadin 使用的会话一经分发就会被破坏,从而导致大量崩溃。
所以事实证明VaadinSession 不实际上可用于会话复制?为什么会这样?我们该如何解决?
注意:我们还有一个使用 Vaadin 8 的应用程序版本,同样的事情也会发生。看来问题是由 Vaadin Spring 集成引起的。
【问题讨论】:
标签: java vaadin session-variables vaadin7 shiro