添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在一些论坛, 博客等项目中. 用户发送的帖子, 文章内容可能会存在太长的情况. 这时如果用户的网速不佳, 或者网络不稳定. 那么将会面临 ** 响应过慢、发送失败 ** 的情况. 如果网站还有自动保存的功能的话, 这种情况会明显增多. 这时如果将传输的内容在本地进行压缩上传, 然后在服务器进行解压. 对长文本的处理能够得到完好解决, 同时极大减少了移动端用户的网络开销.

在前台对请求正文使用 pako_deflate.js 进行本地 gzip 格式压缩

在后台使用 Java 对请求正文进行解压

jdk 1.8.0_77

idea 2016.2.1

maven 3.3.9

commons-io-2.5 (简化 IO 操作)

json-lib-2.4 (处理请求正文中的参数)

spring-webmvc-4.3.4.RELEASE

pako_deflate-1.0.3.js (JS 文本压缩工具类)

JS 压缩请求正文

因为只在前台进行压缩, 所以只需引用 pako 的压缩专用文件 pako_deflate.min.js

又因为我在项目中主要使用 jQuery 发送 Ajax 请求, 所以引入 jQuery

将发送的参数转换为 JSON 字符串

var params = encodeURIComponent(JSON.stringify({

title: "标题",

content: "内容"

gzip 虽然能极大的压缩请求正文. 但是如果内容过小, 压缩后内容反而会增大, 经测试, 对于 params.length 大于 1000 的文本压缩效果能够达到 60% 以上, 所以在压缩前, 需要对内容进行判断

var params = encodeURIComponent(JSON.stringify({

title: title,

content: content

var compressBeginLen = params.length;

if (compressBeginLen > 1000) {

// 对 JSON 字符串进行压缩

// pako.gzip(params) 默认返回一个 Uint8Array 对象, 如果此时使用 Ajax 进行请求, 参数会以数组的形式进行发送

// 为了解决该问题, 添加 {to: "string"} 参数, 返回一个二进制的字符串

params = pako.gzip(params, {to: "string"});

$.ajax({

url: "/gzip",

data: params,

dataType: "text",

type: "post",

headers: {

// 如果 compressBeginLen 大于 1000, 标记此次请求的参数使用了 gzip 压缩

"Content-Encoding": params.length>1000?"gzip":""

success: function (data) {

//dosomething

Java 解压请求正文

首先获取 Content-Encoding 请求头, 根据该请求头中的内容进行逻辑处理

@ResponseBody

@RequestMapping(value = "/gzip")

public String gzip(HttpServletRequest request) {

String params = "";

try {

// 获取 Content-Encoding 请求头

String contentEncoding = request.getHeader("Content-Encoding");

if (contentEncoding != null && contentEncoding.equals("gzip")) {

// 获取输入流

BufferedReader reader = request.getReader();

// 将输入流中的请求实体转换为 byte 数组, 进行 gzip 解压

byte[] bytes = IOUtils.toByteArray(reader, "iso-8859-1");

// 对 bytes 数组进行解压

params = GZIPUtil.uncompress(bytes);

} else {

BufferedReader reader = request.getReader();

params = IOUtils.toString(reader);

if (params != null && params.trim().length() > 0) {

// 因为前台对参数进行了 url 编码, 在此进行解码

params = URLDecoder.decode(params, "utf-8");

// 将解码后的参数转换为 json 对象

JSONObject json = JSONObject.fromObject(params);

// 从 json 对象中获取参数进行后续操作

System.out.println("title:\t" + json.getString("title"));

System.out.println("content:\t" + json.getString("content"));

} catch (IOException e) {

e.printStackTrace();

return params;

* 解压 gzip 格式 byte 数组

* @param bytes gzip 格式 byte 数组

* @param charset 字符集

public static String uncompress(byte[] bytes, String charset) {

if (bytes == null || bytes.length == 0) {

return null;

ByteArrayOutputStream byteArrayOutputStream = null;

ByteArrayInputStream byteArrayInputStream = null;

GZIPInputStream gzipInputStream = null;

try {

byteArrayOutputStream = new ByteArrayOutputStream();

byteArrayInputStream = new ByteArrayInputStream(bytes);

gzipInputStream = new GZIPInputStream(byteArrayInputStream);

// 使用 org.apache.commons.io.IOUtils 简化流的操作

IOUtils.copy(gzipInputStream, byteArrayOutputStream);

return byteArrayOutputStream.toString(charset);

} catch (IOException e) {

e.printStackTrace();

} finally {

// 释放流资源

IOUtils.closeQuietly(gzipInputStream);

IOUtils.closeQuietly(byteArrayInputStream);

IOUtils.closeQuietly(byteArrayOutputStream);

return null;

另外 Jerry Qu 实现了一个服务器使用 Node.js 解压的 DEMO 并提供 deflate,zlib,gzip 三种压缩, 解压方式

以上完整代码可在 gzip 项目中查看

在一些论坛, 博客等项目中. 用户发送的帖子, 文章内容可能会存在太长的情况. 这时如果用户的网速不佳, 或者网络不稳定. 那么将会面临 ** 响应过慢、发送失败 ** 的情况. 如果网站还有自动保存的功能的话, 这种情况会明显增多. 这时如果将传输的内容在本地进行压缩上传, 然后在服务器进行解压. 对长文本的处理能够得到完好解决, 同时极大减少了移动端用户的网络开销.实现思路在前台对请求正文使用... 2、关于 Java 使用 GZIP 进行 压缩 解压 的工具类 import java .io.ByteArrayInputStream; import java .io.ByteArrayOutputStream; import java .io.File; import java .io.FileInputStream; import java .io.FileOutputStream
为了减少数据在网络中的传输量,从而减少传输时长,增加用户体验,浏览器大都是支持 Gzip 压缩 技术的。http的 请求 头 Accept- Encoding : gzip , deflate 就表示这次 请求 可以接受 Gzip 压缩 后的数据,但是这只表示客户端接受的数据可以是 压缩 数据,服务端具体要怎么实现 压缩 呢?我们就从代码层面讲解一下服务端实现 压缩 后的数据传输。 第一步、将响应对象HttpServletRespons...
Gzip 最早由Jean-loup Gailly和Mark Adler创建,用于Unix系统的文件 压缩 。我们在Linux中经常会用到后缀为.gz的文件,它们就是 Gzip 格式的。现今已经成为Internet 上 使用 非常普遍的一种数据 压缩 格式,或者说一种文件格式。 HTTP协议上的 Gzip 编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常 使用 Gzip 压缩 技术来让用户感受更快的速度。
相信很多人在开发中都不可避免会遇到数据量过大,request无法成功传递到后台的问题,通常解决的方法会有: 1、利用ajax异步,将数据切块分别上传,后台进行数据校验以及拼凑;(个人认为这个比较友好,而且可以处理海量数据的传输) 2、 使用 gzip 对数据进行 压缩 ,再将数据 请求 发回后台,后台获取并对数据进行 解压 (这个实现比较简单,而且对数据进行 压缩 传递,可以优化网络性能,不过如果数据量过大, 压缩
使用 场景:app的日志接口需要大量提交日志给服务器,每30s提交一次,一次性最多提交50条日志数据,日志信息包含大量文本数据,导致数据传输量大,故后端的接口改成接受gizp 压缩 后的数据流 java 接口定义: 前端 java script 请求 : let binaryArray = pako. gzip (JSON.stringify(params)); let buffer = new Uint16Array(binaryArray).buffer let url = _configServer.LOG_SERVI
为了减少数据在网络中的传输量,从而减少传输时长,增加用户体验,浏览器大都是支持 Gzip 压缩 技术的。  http的 请求 头Accept- Encoding : gzip , deflate 就表示这次 请求 可以接受 Gzip 压缩 后的数据,但是这只表示客户端接受的数据可以是 压缩 数据,服务端具体要怎么实现 压缩 呢?我们就从代码层面讲解一下服务端实现 压缩 后的数据传输。  有两种方法:         1. 使用 f
URL url = new URL(path); // 打开和url之间的连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // PrintWriter out = null; // 请求 方式 conn.setRequestMethod("POST"); conn.setConnectTi
生产环境上因为带宽是贵重的资源,尤其对于小商家来说,如果对于 请求 不进行 压缩 ,就是白白浪费带宽,不仅浪费钱,还可能影响别的正常业务。所以上生产环境前要简要是否开启了 gzip o 压缩 。 假设接口没有 压缩 前,返回的包长是1454. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbEtVJsn-1590051896613)(https://pic-1251286439.cos.ap-guangzhou.myqcloud.com/input/20200521141850.png)]
// 判断headers里是否包含 content - encoding = gzip Collection<String> encoding Strings = (Collection)response.headers().get(" content - encoding "); if (null != encoding Strings && encoding Strings.contains(" gzip ")) { // 使用 IOUtils,将binary data数据
import java .io.ByteArrayInputStream;    import java .io.ByteArrayOutputStream;    import java .io.IOException;    import java .util.zip. GZIP InputStream;