设置Content-Encoding响应头,告诉浏览器数据的压缩格式

本文介绍了一个Java Web小程序,演示了如何使用GZIPOutputStream流进行数据压缩,并设置了响应头Content-Encoding来通知浏览器接收的数据是经过gzip压缩的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package gacl.http.study;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author gacl
 *这个小程序是用来演示以下两个小知识点
 *1、使用GZIPOutputStream流来压缩数据
 *2、设置响应头Content-Encoding来告诉浏览器,服务器发送回来的数据压缩后的格式
 */
public class ServletDemo02 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data = "abcdabcdabcdabcdabcdabcdab" +
                "cdabcdabcdabcdabcdabcdabcdabcdabc" +
                "dabcdabcdabcdabcdabcdabcdabcdabc" +
                "dabcdabcdabcdabcdabcdabcdabcdabcdab" +
                "cdabcdabcdabcdabcdabcdabcdabcdabcdab" +
                "cdabcdabcdabcdabcdabcdabcdabcdabcdab" +
                "cdabcdabcdabcdabcdabcdabcdabcdabcdab" +
                "cdabcdabcdabcdabcdabcdabcdabcdabcdabcd";
        System.out.println("原始数据的大小为:" + data.getBytes().length);
        
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        GZIPOutputStream gout = new GZIPOutputStream(bout); //buffer
        gout.write(data.getBytes());
        gout.close();
        //得到压缩后的数据
        byte g[] = bout.toByteArray();
        response.setHeader("Content-Encoding", "gzip");
        response.setHeader("Content-Length",g.length +"");
        response.getOutputStream().write(g);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }
}

 

转载于:https://www.cnblogs.com/falloutboy/p/5231009.html

### HTTP 响应头字段意义解析 #### 1. **Date** `Date` 字段表示服务器生成响应的时间戳。它通常用于缓存机制以及帮助客户端判断资源的新鲜度。时间格式遵循 RFC 1123 标准,例如 `Sun, 06 Nov 1994 08:49:37 GMT`[^1]。 #### 2. **Vary** `Vary` 字段指示缓存如何决定是否使用缓存中的副本。它的值通常是请求头字段名,比如 `User-Agent` 或 `Accept-Encoding`。这意味着对于相同的 URL,不同的请求头可能会返回不同版本的响应内容[^2]。 #### 3. **Transfer-Encoding** `Transfer-Encoding` 定义了消息体的传输编码方式。常见的值有 `chunked`,表示消息体被分割成多个块发送,适用于动态生成的内容或未知大小的消息体。这种编码方式允许逐块读取数据而无需提前知道整个消息体的长度[^3]。 #### 4. **Connection** `Connection` 控制当前连接的状态行为。常见值包括 `keep-alive`(保持连接)、`close`(关闭连接)。当设置为 `keep-alive` 时,浏览器可以复用同一个 TCP 连接发起多次请求;而 `close` 则会在完成本次请求后立即断开连接[^1]。 #### 5. **Content-Type** `Content-Type` 描述了实体主体内的对象类型及其字符集信息。例如,在 JSON 数据交互场景下,服务端会通过如下代码指定 MIME 类型和编码: ```java response.setContentType("application/json;charset=utf-8"); ``` 这表明响应内容是一个 UTF-8 编码的 JSON 文档[^4]。 #### 6. **Content-Encoding** `Content-Encoding` 指明了内容经过何种压缩算法处理过。典型的应用如 Gzip (`gzip`)、Deflate (`deflate`) 等。客户端可以通过发出支持的压缩方法列表告知服务器其能力范围,从而实现更高效的网络传输效率提升[^2]。 #### 7. **Server** `Server` 提供关于 Web 服务器软件的信息,可能还包括操作系统名称或其他细节。虽然此头部并非强制性的,但它有助于诊断问题或者了解目标站点的技术栈情况[^3]。 ```python import http.client conn = http.client.HTTPSConnection("example.com") headers = {'Accept': 'text/html'} conn.request("GET", "/", headers=headers) res = conn.getresponse() print(res.status, res.reason) for header in res.headers.items(): print(header) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值