【问题标题】:Cannot Compress Java Server Response Sent To JSP无法压缩发送到 JSP 的 Java 服务器响应
【发布时间】:2012-02-24 15:55:29
【问题描述】:

我无法将压缩响应 (GZip) 从我的 Java Servlet 返回到 JSP。

流程:

  1. 请求来自 java servlet
  2. 处理请求,并创建一个带有响应的 JSON 对象
  3. 将 JSON 对象转换为字符串
  4. 使用 GZip 压缩响应字符串
  5. 压缩的响应字符串在请求对象中设置为属性,并将控制传递给 JSP
  6. 在 JSP 中,响应字符串(压缩)打印在屏幕上

注意事项:

  1. 请求对象的“Accepting-Encoding”设置为“gzip”
  2. 响应标头的“Content-Encoding”设置为“gzip”
  3. 响应内容类型设置为“application/json”
  4. 响应字符编码设置为“ISO-8859-1”

结果:

  1. Firefox 显示“内容编码错误”
  2. Chrome 显示“错误 330 (net::ERR_CONTENT_DECODING_FAILED):未知错误。”

谁能帮我指出正确的方向吗?

【问题讨论】:

    标签: java jsp servlets compression gzip


    【解决方案1】:

    将压缩后的响应字符串设置为请求对象中的属性,并将控制传递给 JSP

    您不应该将 JSON 响应转发到 JSP。您应该已将 JSON 纯文本打印到响应中,并在您的 JSP Android 应用程序中使用 JavaScript/Ajax 代码来调用返回 JSON 的 servlet 的 URL。另见How to use Servlets and Ajax?

    至于 GZIP 压缩,你不应该自己做。让服务器自己做。

    修复您的代码以删除所有压缩响应的手动尝试,它最终应该基本上如下所示:

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String json = createItSomehow();
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(json);
    }
    

    就是这样,如果您让 Android 应用调用 servlet 的 URL,它将检索 JSON 字符串。

    最后编辑服务器配置以启用自动 GZIP 压缩。以 Tomcat 为例,只需在 Tomcat 的 /conf/server.xml 文件中将 compression="on" 添加到 the <Connector> element 即可:

    <Connector ... compression="on">
    

    根据the documentation,可压缩的mime 类型默认为text/html,text/xml,text/plain。您可以将其配置为添加application/json

    <Connector ... compression="on" compressableMimeType="text/html,text/xml,text/plain,application/json">
    

    与具体问题无关,响应字符编码必须设置为UTF-8,这是根据JSON规范。

    【讨论】:

    • 感谢 BalusC 的回复。实际上,我这样做的原因是因为我不希望 JSP 消耗这个响应。由 Android 应用程序使用的响应,请求此 url。因此,我必须将响应打印到 JSP,从那里通过 Android 应用发出的 http 调用读取它。
    • 您应该将其设置为请求属性并且更改响应标头。您基本上是在告诉 entire 响应是一个经过 Gzip 压缩的 JSON 字符串,但是您要转发到一个 JSP,它本质上是一个 text/html 响应,而不是由服务器压缩。如果您想转发到 JSP 以在 HTML 响应中显示 JSON 字符串,那么您应该删除所有更改响应标头的代码,并以通常的方式将 JSON 字符串设置为请求属性。压缩必须在服务器端配置。
    • 对了,你为什么不让你的Android应用直接请求servlet URL而不是JSP URL呢? Android 应用程序在 JSON 字符串周围有一堆 HTML 有什么用处?只需立即将 JSON 写入响应,如“如何使用 Servlet 和 Ajax?”中的 servlet 示例所示。关联。无需转发到 JSP。
    • 我在这里问了一个相关的问题stackoverflow.com/questions/11458234/…
    【解决方案2】:

    JSP 用于将文本数据呈现给客户端。 GZIP 是二进制数据,即使它下面是压缩文本。

    我建议使用 GZIP servlet 过滤器即时压缩数据,而不是在业务逻辑中以编程方式进行。

    关于如何获得一个现成的,请参阅这个先前的问题:Which compression (is GZIP the most popular) servlet filter would you suggest?

    如果做不到这一点,那就编写你自己的 servlet 过滤器来做同样的事情。

    【讨论】:

    • 感谢斯卡夫曼的回复。实际上,我这样做的原因是因为我不希望 JSP 消耗这个响应。由 Android 应用程序使用的响应,请求此 url。因此,我必须将响应打印到 JSP,从那里通过 Android 应用发出的 http 调用读取它。
    • @user377349:您的 servlet 可以直接输出 JSON。它不需要 JSP。
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    相关资源
    最近更新 更多