java - Tomcat Web 应用程序 - 将对象存储为用户定义的对象或简单的 ID 以通过服务器重新启动来保持用户 session ?

标签 java session serialization tomcat reboot

假设我们有一个由 Tomcat 等 servlet 引擎/容器支持的 Web 应用程序。 用户登录。加载该用户的数据库记录(由类 User 的实例表示),我们可以将其存储为具有键“currentUser”的 session 属性,设置一次,然后使用它处理后续请求。另外,我们把更多的对象放在session属性中。非常基本的东西。

现在,如果我们需要部署一些新代码并重新启动 Tomcat...重新启动后用户 session 仍然完好无损(从磁盘/数据库恢复)只要我们不更改任何类实例存储在用户 session 中。但这是一个大问题。我不希望用户在新代码发布时失去他们的 session 。

为了解决这个问题,我想我可以在 session 对象中只存储假定永远不会改变的类的实例(比如将登录用户的 ID 存储为 Integer 而不是 User 的实例类(class))。这样一来,我就再也不会遇到无法在重新启动时反序列化 session 对象的问题了。但这让事情变得稍微复杂一些,因为现在我必须使用 ID 从数据库加载实际对象等(并且使用缓存,性能影响并不是真正的问题)。

这是解决此问题的典型做法吗?

最佳答案

简单的解决方案

按照您的建议,在您的 session 中仅加载 userId,并使用缓存服务(例如 ehcache)来检索用户对象。如果用户对象不存在,它将在第一次加载,但随后将被缓存,后续请求将非常快。如果您担心您的用户类别更改,请将您的缓存内存设置为仅基于它,以便它会在服务器重新启动之间重置。

平台解决方案

看看 Terracotta (http://www.terracotta.org/)。如果您能够在他们的平台上部署您的 session ,他们将允许您在服务器重新启动之间维护它们,并在保留旧字段的同时更新实际用户类。启动并运行后,一切都非常酷。

请记住,Terracotta 集成并不简单,也不适合新手。然而,好处是所有 Web 应用程序通常都需要的可扩展性和高可用性。

关于java - Tomcat Web 应用程序 - 将对象存储为用户定义的对象或简单的 ID 以通过服务器重新启动来保持用户 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5971259/

相关文章:

python - flask : How to do server side cleanup on session expiration?

python - 如何访问 CKAN 扩展中的 session 对象?

C# 通过异步套接字连接发送带有序列化对象的对象大小

xml - 用于快速和肮脏的 XML 序列化的 Ruby 代码?

java - GSON 将所有字段设置为空

java - Android ImageView 动画很慢

c# - asp.net session 变量超时时出现 500 错误

ruby-on-rails - 向 ActiveRecord 序列化添加更多属性?

编译jar时出现java.lang.NoSuchMethodError

java - 观察者/可观察模式