【问题标题】:Force classes to implement Serializable for Tomcat Session Replication强制类为 Tomcat 会话复制实现 Serializable
【发布时间】:2020-02-25 03:29:08
【问题描述】:

我正在实现 tomcat 会话复制以实现集群之间的负载平衡,但是复制需要会话中的所有对象都是可序列化的。

有很多类不是 Serializable 并且存储在集群之前的会话中,我们更改为实现 Serilazable 但是它可能会随着未来类的添加而发生,有人可能会错过 Serializable,这会导致会话复制时出错。

我正在考虑扩展tomcat提供的HttpSession实现并覆盖setAttribute以接收Serializable对象作为参数但是接口方法将Object作为参数所以这是不可能的。

有没有办法可以强制所有要放入会话的类在编译时是 Serilazable 的?

我们正在使用 spring 4。我想知道方面会有所帮助吗?

【问题讨论】:

    标签: java spring session replication tomcat8


    【解决方案1】:

    既不推荐 Java 序列化也不推荐会话复制。尽管如此:

    如果类是可扩展的,您可以使用同样实现Serializable 的类对其进行子类化。当然,任何基类字段都不会被序列化。您将需要自定义 readObjectwriteObject 来执行这些操作。

    要动态地执行此操作,您可能需要一些过滤机制来在对象进出会话时替换它们。

    【讨论】:

    • 我们确实考虑过避免会话复制并使用春季会话,但大多数人并不这么认为。现在我们被复制困住了。子类化会起作用,但这仍然需要每个人都知道。对于过滤器部分,如果我确定对象不是可序列化的,如何动态制作它?字节检测?
    • @GautamTadigoppula 您可以使用Java agent 在代码加载时(不晚于进入会话时)添加implements Serializable。幸运的是,仅仅添加一个无方法接口并不是对类文件的大修改(使用合适的库)。但是我在想的是,在将对象插入会话时将其替换为不同类中的一个。新类只需要类名和字段到值的映射。详细信息取决于您的值对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多