为什么 HttpServlet 实现 Serializer?

根据我对 Servlet 的理解,Servlet 将由 Container 实例化,它的 init()方法将被调用一次,Servlet 将像单例一样生存,直到 JVM 关闭。

我不希望我的 servlet 被序列化,因为当应用服务器恢复或正常启动时,它将被构建为新的。Servlet 不应该包含特定于会话的成员,因此将其写入磁盘并重新实例化是没有意义的。 这个有实际用途吗?

我担心的是,我把一些不可序列化的字段放在那里,然后我的应用程序会在一个生产环境中神秘地失败,在这种环境中会发生不同类型的会话复制。

14210 次浏览

从技术上讲,我相信 servlet 容器可以将 servlet 对象“钝化”到磁盘,其方式与 EJB 会话 bean 类似。因此,如果你问你的应用程序是否会因为不可序列化的字段而失败,这个问题是正确的。

在实践中,我从未听说过容器这样做,所以它实际上只是早期 J2EE 糟糕的旧时代遗留下来的包袱。我不担心。

谷歌似乎暗示,这样做是为了让容器作者可以选择,如果他们想要的话。

您说得对,servlet 不应该包含任何特定于会话的成员,实际上我认为您需要的状态越少越好。如果您将所有内容存储在 Session 或 ServletConfig 中,我认为您能够在序列化中生存。

就像针对那些提供集群选项的 Servlet 容器对 Session 对象进行序列化以存活缓存一样,容器也可以选择将 Servlet 实例传输到另一个集群节点?我只是猜测

HttpServlet 应该通过序列化到磁盘,并在 servlet 容器重新启动后存活下来。例如,tomcat 允许您设置标志,使这种类型的生存。下一个选项是使用 JNDI 进行传输。这不是垃圾,它只在极端用例中使用。

可序列化用作分布式环境中会话属性的 标记接口

SRV.7.7.2分布式环境(JSR-154)

在标记为 可分配的应用程序中,所有请求 是会话的一部分,必须由一个 Java 虚拟机来处理 (“ JVM”)。容器必须能够处理所有对象 使用 setAttribute 放置到 HttpSession 类的实例中 或 putValue 方法 为满足这些条件而强加的:

  • 容器必须接受实现 Serializer 接口 的对象。
  • 会话的迁移将由特定于容器的工具处理。

分布式 servlet 容器必须引发 < strong > 容器不能执行的对象的 IllegalArgumentException 支持迁移会话存储所必需的机制 他们

分布式 servlet 容器必须支持必要的机制 为了 迁移实现 Serializable 的对象。

(...)

容器提供者可以确保可伸缩性和服务质量 通过 < strong > 实现负载平衡和故障转移等功能 控件的任何活动节点移动会话对象及其内容 分布式系统到系统的另一个节点 集装箱 持续或迁移会话提供质量 服务特性,它们不限于使用本机 JVM 序列化 HttpSession 及其 开发人员不能保证容器将调用 会话属性上的 readObject 和 writeObject 方法,如果它们 实现它们,< strong > 但保证 它们的属性将被保留