一尘不染

如果Tomcat7服务器已压缩GZIP,Android客户端将如何?

tomcat

至于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);
}

现在,下面是来自Apache Tomcat 7配置页面的HTTP连接器

压缩

连接器可能会使用HTTP / 1.1 GZIP压缩,以节省服务器带宽。该参数的可接受值为“ off”(禁用压缩),“
on”(允许压缩,这将导致压缩文本数据),“ force”(在所有情况下均强制压缩)或数字整数值(即等效于“
on”,但指定压缩输出之前的最小数据量。如果内容长度未知,并且压缩设置为“ on”或更具攻击性,则输出也将被压缩。如果未指定,则此属性设置为“
off”。

compressionMinSize

如果压缩设置为“ on”,则此属性可用于指定压缩输出之前的最小数据量。如果未指定,则此属性默认为“ 2048”

这意味着压缩设置为开时。仅当数据大于2084时才会压缩。

在我的Android客户端中,我正在使用以下代码查找数据是否经过gzip压缩

if ( entity.getContentEncoding() != null && "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())

我的问题

服务器entity.getContentEncoding().getValue()在压缩数据时是否还会设置的值?


阅读 223

收藏
2020-06-16

共1个答案

一尘不染

服务器对entity您的android应用中的内容一无所知。Content-Encoding如果使用gzip,则Tomcat的连接器将适当地设置响应头。

另外,您的代码比需要的要复杂。您可以这样做:

if ( "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())

…因为没有NPE的机会。

2020-06-16