java - 反序列化 Google Web Kit 响应 (Java) 和 Java Servlet

标签 java servlets serialization gwt

我有一个单一的遗留应用程序,我需要读取数据并向其提交数据。它使用 Google Web Kit 和 Java Servlet。 我可以访问源代码,但我对 Servlet 和 GWT 都是新手。

我正在尝试在我的项目中封装一个休息客户端,该客户端可以与旧服务器的 GET/POST 休息调用进行通信。

我已经能够使用 Postman 发送 POST 请求,然后使用 Reactive Spring 5.0 框架发送该请求。

当我尝试反序列化响应时,遇到了大量错误。

我如何反序列化此有效负载?

7|0|7|http://localhost:8080/testproject/
|29F4EA1240F157649C12466F01F46F60|
com.test.client.GreetingService|greetServer|java.lang.String|
myInput1|myInput2|1|2|3|4|2|5|5|6|7|

我搜索了一整天,并关注了一些这样的博客: https://docs.google.com/document/d/1eG0YocsYYbNAtivkLtcaiEE5IOF5u4LUol8-LL0TIKU/edit# https://blog.gdssecurity.com/labs/2009/10/8/gwt-rpc-in-a-nutshell.html

我不确定代码方面如何将它们序列化为我自己的新服务对象。

static WebClient webClient = WebClient.create();

public static void main(String[] args) {

    Mono<String> body = Mono.just("7|0|7|http://localhost:8080/testproject/|29F4EA1240F157649C12466F01F46F60|com.test.client.GreetingService|greetServer|java.lang.String|myInput1|myInput2|1|2|3|4|2|5|5|6|7|");

    Mono<String> response = webClient.post()
            .uri("http://localhost:8080/testproject/")
            .header("Content-Type", "text/x-gwt-rpc;charset=UTF-8")
            .header("X-GWT-Module-Base", "http://localhost:8080/testproject/")
            .header("X-GWT-Permutation", "29F4EA1240F157649C12466F01F46F60")
            .cookie("JSESSIONID", "2BCEBF12GE2C3A0335F5012812A73638")
            .body(body, String.class)
            .retrieve()
            .bodyToMono(String.class);

    String unBlocked = response.block();

    System.out.println(unBlocked);
    //OK[1,1,["java.lang.Integer/3438228391"],0,2]

    try {
    ServerSerializationStreamReader streamReader = new ServerSerializationStreamReader(
        Thread.currentThread().getContextClassLoader(), null);
        streamReader.prepareToRead(unBlocked);
        System.out.println(streamReader.readObject());
    } catch ( Exception e) {
        e.printStackTrace();
    }
}

错误: com.google.gwt.user.client.rpc.InknownRemoteServiceException:此应用程序已过期,请单击浏览器上的刷新按钮。 (收到格式错误或旧的 RPC 消息 - 期望版本在 5 到 7 之间)

由于 RCP 消息格式错误,我尝试了 GWT 的每个版本。 另外,我尝试将它粘在一根绳子上,我确信这本身是失败的。

最佳答案

您正在尝试使用解码客户端请求的代码来解码服务器响应。目前,由于历史原因,它们使用不同的格式 - 请注意响应如何以“//OK”开头,但请求以版本/标志/字符串计数“7|0|7”开头。

至少在一小部分中,这是因为当客户端调用服务器时,它需要描述它正在使用的版本以及服务器应该在哪里找到列出客户端期望允许序列化的类集的文件。当服务器响应时,由于客户端已经告诉它可以序列化的类型,因此它不需要再次告诉客户端同样的事情。

阅读 com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader 类及其文档将显示响应格式以及如何将其解码为对象。据我所知,目前还没有服务器端代码可以完成这项工作,但编写起来可能没有什么困难,只需一些持久性即可。

关于java - 反序列化 Google Web Kit 响应 (Java) 和 Java Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48273240/

相关文章:

java - 有 Logback 摘要器吗?

java - Spring 没有注入(inject) bean,我做错了什么?

c# - 以二进制、打包格式序列化结构

java - 什么是 serialVersionUID,我为什么要使用它?

java - 在构造函数中调用 super()

java - Antlr4 : Evaluate math functions f(x)

java - 在设备所有者应用程序中启用 GPS

java - 如何在 $TOMCAT_HOME/logs 中为我的 servlet 创建命名日志?

java - 如何在 servlet 线程中获取新的有状态 session bean?

java - 关闭 Jar 文件后恢复数据