【发布时间】:2011-09-02 09:31:57
【问题描述】:
Google Web Toolkits (GWT) RPC 调用的数据格式看起来如何以及 IsSerializable 对象是如何传输的。我知道 Java Serializable 传输某种二进制格式,但是 GWT 也是这种情况吗? (因为我不希望它与 JavaScript 兼容,或者至少需要一些额外的解析)。
【问题讨论】:
Google Web Toolkits (GWT) RPC 调用的数据格式看起来如何以及 IsSerializable 对象是如何传输的。我知道 Java Serializable 传输某种二进制格式,但是 GWT 也是这种情况吗? (因为我不希望它与 JavaScript 兼容,或者至少需要一些额外的解析)。
【问题讨论】:
编辑: Brian Slesinsky 刚刚记录了协议(通过对代码进行逆向工程):https://docs.google.com/document/d/1eG0YocsYYbNAtivkLtcaiEE5IOF5u4LUol8-LL0TIKU/edit
首先,GWT-RPC 协议是不对称的,因此它总是针对客户端进行优化:快速反序列化来自服务器的内容,快速序列化发送给它的内容。
它显然不是二进制的,正如你所怀疑的,而是基于文本的。客户端到服务器协议是管道分隔的,而服务器到客户端是基于 JSON 的(带有 //OK 或 //EX 前缀来判断请求是成功还是失败)。两者都使用可序列化类的常识进行序列化/反序列化;例如,双方都知道类 X 有两个字段,一个整数和一个字符串,按该顺序序列化,所以他们都写入/读取一个整数,然后是一个字符串,无需在编码格式中指定它是哪个字段关于。
GWT-RPC 协议是版本化的(随着新 GWT 版本的发布,它会定期更改),并使用类的哈希值和可序列化字段的名称来确保客户端和服务器都使用相同版本的类(这意味着您每次更改可序列化类时都必须重新编译和重新部署客户端代码)。
最好的文档是代码,但您可以在这些幻灯片中找到请求格式的概述:https://www.owasp.org/images/7/77/Attacking_Google_Web_Toolkit.ppt
RequestFactory,与 GWT-RPC 不同,使用基于 JSON 的对称协议(基于 AutoBean 的 JSON 序列化),即使不是从相同的代码编译,客户端和服务器也可以进行通信(嗯,取决于您在版本之间所做的更改,当然),因为它们传递类和属性名称。
【讨论】:
AutoBeans进行JSON序列化。