Spring Boot 与 Gzip 压缩

响应压缩是 Web 应用一种常见的优化手段,通过压缩算法减小传输数据的体积,提高传输效率、节约带宽。客户端接收到数据后,使用相同的算法对数据进行解压从而获取到原始数据。

客户端和服务器需要通过 Header 来协商双方支持的压缩算法。

  • Accept-Encoding:请求头,告诉服务器客户端支持的压缩算法(多个使用逗号分割)。例如:Accept-Encoding: gzip, deflate
  • Content-Encoding:响应头,告诉客户端当前 Payload 使用的编码方式(压缩算法)。例如:Content-Encoding: gzip

常用的压缩算法如下:

  • gzip
  • deflate
  • br

JDK 提供了对 GZIP 压缩算法的实现:GZIPOutputStream 和 GZIPInputStream,我们可以用它们来实现 Gzip 压缩和解压缩。

一、使用 Gzip 压缩响应

在 Spring Boot 应用中创建一个 Controller,使用 GZIPOutputStream 把一张图片文件(20 KB)压缩后响应给客户端。

package cn.springdoc.demo.web.controller;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.zip.GZIPOutputStream;import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;@RestController
@RequestMapping("/demo")
public class DemoController {@GetMappingpublic void file (HttpServletRequest request, HttpServletResponse response) throws IOException {// 20.0 KB 大小的图片文件Path file = Paths.get("C:\\Users\\KevinBlandy\\Desktop\\springdoc-logo.png");// 设置文件类型response.setContentType(Optional.ofNullable(Files.probeContentType(file)).orElse(MediaType.APPLICATION_OCTET_STREAM_VALUE));// 设置压缩方式为 gzip 【关键点 1:设置正确的 CONTENT_ENCODING 头】response.setHeader(HttpHeaders.CONTENT_ENCODING, "gzip");// 包装 response 流为 gzip 流 【关键点 2:使用 GZIPOutputStream 封装 response 流,并写出数据】try(GZIPOutputStream gzipOutputStream = new GZIPOutputStream(response.getOutputStream())){// 响应给客户端Files.copy(file, gzipOutputStream);}}
}

如上。关键点在于设置 CONTENT_ENCODING Header 为 gzip,告诉浏览器使用了 gzip 压缩算法,浏览器会自动使用相同算法进行解压缩。

最后,使用 GZIPOutputStream 封装 response 流,往 gzipOutputStream 中写入的数据就会被 gzip 压缩。

启动应用,使用浏览器访问:http://localhost:8080/demo

Spring Boot Gzip 压缩响应

通过控制台的网络面板,你可以看到:

  1. 浏览器通过 Accept-Encoding 告诉服务器,它支持 gzip 压缩算法。
  2. 服务器正确地指定了 Payload 的编码类型为 gzip
  3. 由于使用了 Gzip 压缩,数据的传输体积小于文件体积。

图片在浏览器中预览成功,也说明服务器和客户端都进行了正确的编解码。

二、Spring Boot 配置响应压缩

对于这种如此常用的功能,Spring Boot 早已提供了开箱即用的支持。

可以在 application.yaml / application.properties 文件中配置如下属性,开启全局 Gzip 响应压缩:

属性

说明

默认值

server.compression.enabled

是否开启全局响应压缩

false

server.compression.excluded-user-agents

以逗号分隔的 User Agent 列表,对这些 User Agent 的响应不会被压缩。

server.compression.mime-types

逗号分割的文件 MIME Type(媒体类型),这些类型的文件才会被压缩。

[text/html, text/xml, text/plain, text/css, text/javascript, application/javascript, application/json, application/xml]

server.compression.min-response-size

进行压缩的最低 Content-Length 值。

2KB

在 application.yaml 中添加如下配置:

server:compression:# 开启响应压缩enabled: truemime-types: - image/png # 压缩 png 图片# 进行压缩的最小体积min-response-size: 1KB

其实只需要设置 server.compression.enabled=true 即可,这里故意设置 server.compression.min-response-size=1KB 完全是为了进行演示,因为示例图片不足 2KB

server.compression.min-response-size 值不应该过小,否则压缩后的数据体积可能比原始数据还大。

还需要覆盖 server.compression.mime-types 配置,因为默认配置的压缩的文件类型列表中不包含图片。

修改 Controller,如下:

@GetMapping
public ResponseEntity<Resource> file (HttpServletRequest request, HttpServletResponse response) throws IOException {// 20.0 KB 大小的图片文件Path file = Paths.get("C:\\Users\\KevinBlandy\\Desktop\\springdoc-logo.png");return ResponseEntity.ok().contentType(MediaType.IMAGE_PNG) // 正确设置图片的 Content Type,浏览器才会预览图片.body(new InputStreamResource(Files.newInputStream(file)));
}

这次不自己使用 GZIPOutputStream 进行压缩响应,而是直接返回 ResponseEntity<Resource> 对象。这也是关键点,如果你想基于配置的全局 Gzip 响应压缩生效,则不能自己使用 HttpServletResponse 进行数据响应,必须要通过返回对象,由 DispatcherServlet 处理,全局响应压缩才会生效。

重启应用,用浏览器再次请求 http://localhost:8080/demo,你会发现结果跟上节中的测试结果一样。全局 Gzip 压缩配置生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10 火绒 每次打开word、excel都会提示,你要如何打开这个文件

一、概述 最近电脑每次打开办公软件&#xff0c;比如word、excel等&#xff0c;都会提示让选择如何打开这个文件&#xff1f;即使是默认程序已经关联的启动文件&#xff0c;也是会提示&#xff0c;不管是设置“始终使用此应用打开.xIsx 文件”几次&#xff0c;还是一样的提示&…

python接口自动化测试之接口数据依赖

一般在做自动化测试时&#xff0c;经常会对一整套业务流程进行一组接口上的测试&#xff0c;这时候接口之间经常会有数据依赖&#xff0c;那又该如何继续呢&#xff1f; 那么有如下思路&#xff1a; 抽取之前接口的返回值存储到全局变量字典中。初始化接口请求时&#xff0c;…

深度了解LinkedBlockingQueue底层实现原理

文章目录 前言一、Queue接口的定义二、AbstractQueue实现Queue的基本操作1.AbstractQueue源码注释解析2.方法add、remove、element、clear、addAll的实现原理 三、BlockingQueue接口定义解析1.入列操作2.出列操作3.其他操作 四、LinkedBlockingQueue源码解析1.LinkedBlockingQu…

【SEO学习】其他技术

还有其他各种与搜索引擎优化有关的技巧。我们没有将它们归入任何特殊类别&#xff0c;因此将它们归入杂项类别。请逐一阅读这些技巧。 禁忌列表 不要在网页上保留隐藏文字。不要使用错误的关键字来制作垃圾图片。不要使用元标签。不要在网站上使用框架和 Flash。不要与黑名单…

Keithley2420吉时利2420数字源表

Keithley2420吉时利2420数字源表系列&#xff0c;专用于要求紧密结合源和测量的测试应用。全部数字源表型号都提供精密电压源和电 流源以及测量功能。每款数字源表既是高度稳定的直流 电源也是真仪器级的6位半万用表。此电源的特性包括 低噪声、精密和回读。此万用表的功能包括…

容斥 C. Strange Function改编题

补题&#xff1a; 题目详情 - 9.段坤爱取模%%% - SUSTOJ 本题或许是参考 Problem - C - Codeforces 根据题意&#xff0c;f(i)就是不能被整除的最小的一个质因子。 打表发现&#xff0c;当15个质因子相乘后&#xff0c;长度就大于18。 因此可以知道小于等于1e16内的正整数x…

rviz是如何获取图像里选择的点云的3D坐标的

以前以为rviz是用OpenGL渲染绘图&#xff0c;那么获取图像里像素点对应的真实3D坐标是采用的OpenGL里提供的API实现的&#xff0c;结果一看代码还真不是这样&#xff0c;rviz也就渲染用了OpenGL&#xff0c;其他都是自己实现的&#xff0c;图像界面的实现完全是遵循MVC设计模式…

LeetCode100122. Separate Black and White Balls

文章目录 一、题目二、题解 一、题目 There are n balls on a table, each ball has a color black or white. You are given a 0-indexed binary string s of length n, where 1 and 0 represent black and white balls, respectively. In each step, you can choose two a…

C++ 输入输出优化

对比广大博客之后总结如下。 有些题目强制要求在线&#xff0c;输出需要flush&#xff0c;那么这里输出只用cout&#xff0c;cout<<endl。 只开ios优化&#xff0c;不开cin.tie和cout.tie。 read()快读 输入整数。 inline int read(){int x0;char cgetchar();while(c…

4本期刊被踢!11月SCI/SSCI目录已更新

​2023年11月20日&#xff0c;科睿唯安更新了Web of Science核心期刊目录。 此次更新后SCIE期刊目录共包含9481本期刊&#xff0c;SSCI期刊目录共包含3551本期刊。此次SCIE & SSCI期刊目录更新&#xff0c;与上次更新&#xff08;2023年10月&#xff09;相比&#xff0c;共…

git进阶使用《多账号管理》

git 多账号管理 解决问题&#xff1a;同一台电脑&#xff0c;N 个 github 账号同时存在&#xff0c;需要对应 N 个 github 账号的 SSH key 1、运行 git Bash 客户端&#xff0c;输入如下代码&#xff1a; $ cd ~/.ssh $ ls2、创建一个 SSH key $ ssh-keygen -t rsa -C "…

模拟shell小程序

接下来利用我们当前的知识&#xff0c;撰写一个简单的shell外壳程序。 1.shell原理 shell的原理是实际上就是运行了一个父进程&#xff0c;然后创建出子进程&#xff0c;最后使用进程替换调用&#xff0c;替换成其他程序。 2.shell实现 2.1.死循环 首先一个shell一旦运行起…

解决Spring Cloud整合Nacos与Gateway的探险之旅

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 解决Spring Cloud整合Nacos与Gateway的探险之旅&#xff08;报错汇总&#xff09; 前言Caused by: com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.Abstra…

PixCake:让你的照片焕发新生的AI人像处理技术修图软件

大家好&#xff01;今天我要向大家推荐一款令人惊艳的AI人像处理技术修图软件——PixCake像素蛋糕。无论你是摄影爱好者还是普通用户&#xff0c;PixCake都能帮助你将照片修饰得更加出色、生动。 PixCake拥有强大的AI人像处理技术&#xff0c;可以自动识别照片中的人物&#x…

建筑可视化中的 3D 纹理

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1、什么是 3D 纹理&#xff1f; 纹理是将二维图像添加到三维模型的技术艺术。虽然对物体进行纹…

Linux安装Mysql详细教程(两种安装方法)

Linux之Mysql安装配置 第一种&#xff1a;Linux离线安装Mysql&#xff08;提前手动下载好tar.gz包&#xff09;第二种&#xff1a;通过yum安装配置Mysql&#xff08;服务器有网络&#xff09; 第一种&#xff1a;tar.gz包安装 1、 查看是否已经安装 Mysql rpm -qa | grep m…

计算机网络的标准化工作及相关组织

一、国际化组织 计算机网络的标准化工作由一些主要的组织来进行管理和推动。以下是几个主要的计算机网络标准化的国际组织及其相关的标准&#xff1a; 1. 国际标准化组织&#xff08;ISO&#xff09;&#xff1a;国际标准化组织负责制定各种行业的标准&#xff0c;包括计算机…

为什么游戏公司选择物理服务器

为什么游戏公司选择物理服务器 1、选择的自由 选择游戏物理服务器可让我们根据需要自由选择和配置硬件。在完成设置和配置新获得的游戏服务器的所有艰苦工作后&#xff0c;请始终查看我们获得的价格&#xff0c;以确保自己拥有足够的带宽资源、端口容量和CPU核心&#xff0c;以…

JVM线程的几种状态

1.New 新建的线程&#xff0c;线程还没启动。 2.Runnable 线程正在运行或者等待操作系统中的其他资源&#xff0c;例如线程运行过程中&#xff0c;系统分配资源给其他操作&#xff0c;此时这个线程还是Runnable状态&#xff0c;可以理解为可运行的线程。 3.Blocked 阻塞状…

SpringBoot 整合 Freemarker

通过 Freemarker 模版&#xff0c;我们可以将数据渲染成 HTML 网页、电子邮件、配置文件以及源代码等。 Freemarker 不是面向最终用户的&#xff0c;而是一个 Java 类库&#xff0c;我们可以将之作为一个普通的组件嵌入到我们的产品中。 Freemarker 模版后缀为 .ftl(FreeMarke…