【问题标题】:Servlet returning response unexpectedly in Base64 formatServlet 以 Base64 格式意外返回响应
【发布时间】:2016-10-27 21:18:53
【问题描述】:

这是关于我在制作servlet 时目睹的一种奇怪行为,它根据我提供给servlet 的一些参数从Apache Solr 调用和获取数据。

servlet 查询Solr 并以 json 格式返回数据给我。然后通过放置System.out.println(response) 进行验证。它只有 json 格式。

我的问题是,当我收到来自使用此服务的客户端的相同响应时,数据以Base64 格式返回。在我的代码中,我什至没有写一行将响应转换为Base64。我在发送回复之前写的唯一一行是resp.setContentType("application/json")

虽然我后来通过在我的servlet 中设置resp.setCharacterEncoding("UTF-8"); 在发送响应之前解决了这个问题。然后,每次我在客户端或通过REST client 查询时,我只收到JSON 响应。但我仍然想知道,为什么会发生这种情况,为什么从servletJSON 发送的响应会转换为Base64

以前有没有人经历过这样的事情?

我使用 Apache Tomcat 作为我的服务器。

【问题讨论】:

    标签: java rest tomcat servlets solr


    【解决方案1】:

    这很可能是您的 Java servlet 框架的属性。您的 Solr 内容可能包含英语以外的 Unicode 范围内的字符。因此,该算法认为它实际上是一个二进制响应并将其编码为 base64(可能带有更改的 mime-type 标头)。

    设置字符编码告诉框架需要全范围的字符,不需要转义。

    或者这可能在 Tomcat 中。但在我看来,文档搜索的重点应该是转义二进制内容。

    【讨论】:

    • 在我的 servlet 中,当我打印从 Solr 收到的响应时,它只是 JSON。而且 Solr 中的整个索引仅包含英语。那么,您是想说 Tomcat 解释了应该以 Base64 发送响应吗?这里要注意的一点是,当我在我的 servlet 中向 Solr 发出 HTTP POST 请求时,我已经将我的编码设置为 UTF-8 。那么为什么我仍然需要将响应强制字符编码设置为 UTF-8 呢?此外,在 Google App Engine 中运行相同的 servlet 不会产生此类问题,并且仅以 JSON 格式接收响应。
    • 好吧,你在回答你自己的问题。什么差异触发了编码?听起来像 Tomcat,所以专注于此。
    • 嗯...会那样做。但由于这个问题是通过设置字符编码解决的,只能事后诸葛亮。尝试了这种行为的 Tomcat 文档,没有找到任何具体的陈述。但它确实提出了一个问题,即数据格式的完整性是如此脆弱,以至于Application Server 可以根据自己的考虑对其进行更改?
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2019-05-18
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多