无法压缩发送给JSP的Java Server响应

时间:2012-02-24 15:55:29

标签: java jsp servlets compression gzip

我在从Java Servlet返回压缩响应(GZip)到JSP时遇到了麻烦。

流程:

  1. 请求来自java servlet
  2. 处理请求,并使用响应
  3. 创建JSON对象
  4. 将JSON对象转换为字符串
  5. 使用GZip
  6. 压缩响应字符串
  7. 压缩响应字符串在请求对象中设置为属性,控件传递给JSP
  8. 在JSP中,响应字符串(压缩)打印在屏幕上
  9. 注意事项:

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

      1. Firefox显示“内容编码错误”
      2. Chrome显示“错误330(net :: ERR_CONTENT_DECODING_FAILED):未知错误。”
      3. 任何人都可以帮我指出正确的方向吗?

2 个答案:

答案 0 :(得分:3)

  

压缩响应字符串在请求对象中设置为属性,控件传递给JSP

您不应该将JSON响应转发给JSP。您应该已将JSON plain打印到响应中,并在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的compression="on"文件中添加/conf/server.xmlthe <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规范。

答案 1 :(得分:2)

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

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

请参阅此先前的问题,了解如何抓住现成的Which compression (is GZIP the most popular) servlet filter would you suggest?

如果失败了,那就编写自己的servlet过滤器来做同样的事情。