假设我们有一个由 Tomcat 之类的 servlet 引擎/容器支持的 Web 应用程序。用户登录。该用户的数据库记录(由 User 类的实例表示)被加载,我们可以将其存储为带有键“currentUser”的会话属性,设置一次,然后使用它处理后续请求。此外,我们在 session 属性中放入了更多的对象。很基本的东西。
现在,如果我们需要部署一些新代码并重新启动 Tomcat……只要我们不更改任何实例存储在用户中的类,用户会话在重新启动后仍然完好无损(从磁盘/数据库恢复)会话。但这是一个大问题。我不希望用户在新代码发布时失去他们的会话。
为了解决这个问题,我想我可以在会话对象中仅存储假定永远不会更改的类的实例(例如将登录用户的 ID 存储为整数而不是 User 类的实例)。然后我永远不会遇到无法在重新启动时反序列化会话对象的问题。但这使事情变得稍微复杂一些,因为现在我必须使用 ID 从数据库等加载实际对象(并且使用缓存,性能损失并不是真正的问题)。
这是解决此问题的通常做法吗?