GZIP压缩:将压缩后的文本文件,发送给浏览器,减少流量。
一、进行gzip压缩条件:
1、请求头:Accept-Encoding : gzip 告诉服务器,该浏览器支持gzip压缩。
2、响应头:Content-Encoding : gzip. 告诉浏览器,输出信息用gzip进行压缩了。
3、两个主要类:
ByteArrayOutputStream : 内存输出流,还有缓存。
GZIPOutputStream 包装流;
二、gzip 压缩步骤:
1、获取字符的字节数组 byte[] buf = str.getBytes() ;
2、通过GZIPOutputStream 包装流进行输入:
创建 GZIPOutputStream 输出流时,需要传一个带有缓冲区的输出流,所以我们ByteArrayOutputStream 输出流。而且,ByteArrayOutputStream还可以获取byte[];
3、将ByteArrayOutputStream 流中的缓存数据,转换成字节数组。
4、将 压缩后的字节数组通过response 进行输出。不过输出之前要设置Content-Encoding 响应头,value为gzip。告诉浏览器数据进行了gzip压缩,要使用gzip解压。
1 String str = "我是个测试"; 2 //1\获取字节数组 3 byte[] bytes = str.getBytes() ; 4 5 System.out.println("压缩前的长度:" + bytes.length); 6 //2\ 7 ByteArrayOutputStream baos = new ByteArrayOutputStream() ; 8 GZIPOutputStream gzip = new GZIPOutputStream(baos) ; 9 10 gzip.write(bytes) ; 11 gzip.close() ; 12 //3\ 13 bytes = baos.toByteArray() ; 14 System.out.println("压缩后的长度:" + bytes.length);
数据较小是,压缩的效果不是很明显,不过数据越大,压缩效果越明显。所以,GZIP压缩一般只处理文本内容,对图片、已经压缩过的文件则不进行压缩。这时就要在配置文件时,配置要过滤的资源。
三、GZIPFilter
1 import itheima.decorator.MyHttpServletResponse; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.IOException; 5 import java.util.zip.GZIPOutputStream; 6 7 import javax.servlet.Filter; 8 import javax.servlet.FilterChain; 9 import javax.servlet.FilterConfig; 10 import javax.servlet.ServletException; 11 import javax.servlet.ServletRequest; 12 import javax.servlet.ServletResponse; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 /** 16 * Gzip压缩过滤器 17 * @author 贺佐安 18 * 19 */ 20 public class GZIPFilter implements Filter{ 21 22 public void init(FilterConfig filterConfig) throws ServletException { 23 } 24 25 public void doFilter(ServletRequest req , ServletResponse resp , 26 FilterChain chain) throws IOException, ServletException { 27 HttpServletResponse response = (HttpServletResponse) resp ; 28 HttpServletRequest request = (HttpServletRequest) req ; 29 //创建HttpServletResponse 包装类的实例 30 MyHttpServletResponse myResponse = new MyHttpServletResponse(response) ; 31 32 chain.doFilter(request, myResponse) ; 33 34 //GZIP压缩: 35 byte[] buff = myResponse.getBufferedBytes() ; 36 //创建缓存容器: 37 ByteArrayOutputStream baos = new ByteArrayOutputStream() ; 38 39 GZIPOutputStream gzip = new GZIPOutputStream(baos) ; 40 41 gzip.write(buff) ; 42 43 gzip.close() ; 44 45 buff = baos.toByteArray() ; 46 47 //设置响应头; 48 response.setHeader("Content-Encoding", "gzip"); 49 response.setContentLength(buff.length) ; 50 response.getOutputStream().write( buff) ; 51 } 52 53 public void destroy() { 54 } 55 56 }
步骤:
1、对HttpServletResponse 进行包装 :改写getOutputStream()、getWriter() 方法,并且设置一个临时容器,存储Serlvet处理后要输出的数据。 这里是重点。
1 import java.io.ByteArrayOutputStream; 2 import java.io.IOException; 3 import java.io.OutputStreamWriter; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletOutputStream; 7 import javax.servlet.http.HttpServletResponse; 8 import javax.servlet.http.HttpServletResponseWrapper; 9 /** 10 * 对HttpServletResponse 进行包装 11 * @author 贺佐安 12 * 13 */ 14 public class MyHttpServletResponse extends HttpServletResponseWrapper { 15 //定义一个容器,用来存储Serlvet 处理完后response 写出的数据 16 private ByteArrayOutputStream bos = new ByteArrayOutputStream() ; 17 private PrintWriter printWriter = null; 18 public MyHttpServletResponse(HttpServletResponse response) { 19 super(response) ; 20 } 21 //处理字节流输出的情况 22 public ServletOutputStream getOutputStream() throws IOException { 23 return new MyServletOutputStream(bos); 24 } 25 26 //处理字符流输出的情况:用字符流时要注意乱码:字节转字符要查码表,字符转字节也要查码表 27 public PrintWriter getWriter() throws IOException { 28 printWriter = new PrintWriter(new OutputStreamWriter(bos, super.getCharacterEncoding())) ; 29 return printWriter; 30 } 31 //获取response 写出的数据 32 public byte[] getBufferedBytes(){ 33 try { 34 if (printWriter != null) 35 printWriter.close() ; 36 bos.flush() ; 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 byte[] byteArray = bos.toByteArray() ; 41 return byteArray; 42 } 43 }
2、改写getOutputStream 方法时,要返回一个SerlvetOutputStream 类实例,因为SerlvetOutputStream是抽象类,不能创建实例,所以要重写SerlvetOutputStream 类:
1 import java.io.ByteArrayOutputStream; 2 import java.io.IOException; 3 4 import javax.servlet.ServletOutputStream; 5 /** 6 * 包装ServletOutputStream ,改写write 方法。 7 * @author 贺佐安 8 * 9 */ 10 public class MyServletOutputStream extends ServletOutputStream { 11 private ByteArrayOutputStream bos = null ; 12 public MyServletOutputStream (ByteArrayOutputStream bos) { 13 this.bos = bos ; 14 } 15 public void write(int b) throws IOException { 16 bos.write(b) ; 17 } 18 }
3、将包装过的HttpServletResponse 类的实例放行。
4、然后获取Servlet 处理过后的数据,然后进行Gzip压缩。
5、调用ServletResponse 的实例,将压缩后的数据写出去。
1 //GZIP压缩: 2 byte[] buff = myResponse.getBufferedBytes() ; 3 //创建缓存容器: 4 ByteArrayOutputStream baos = new ByteArrayOutputStream() ; 5 6 GZIPOutputStream gzip = new GZIPOutputStream(baos) ; 7 8 gzip.write(buff) ; 9 10 gzip.close() ; 11 12 buff = baos.toByteArray() ; 13 14 //设置响应头; 15 response.setHeader("Content-Encoding", "gzip"); 16 response.setContentLength(buff.length) ; 17 response.getOutputStream().write( buff) ;
以上便是用Filter 对一些文本资源进行GIZP压缩的步骤。重点就是第二步,如何获取Servlet 返回的数据。更细一点的流程如下图:
相关推荐
本文将深入探讨gzip的原理、C语言实现细节以及如何进行gzip压缩和解压缩。 首先,gzip基于著名的DEFLATE算法,该算法结合了LZ77(一种字典压缩方法)和霍夫曼编码(一种变长编码技术)。在C语言中实现gzip,我们...
标题中的“利用JAVASCRIPT实现GZIP压缩与解压缩”指的是在JavaScript环境中,我们可以使用原生或第三方库来处理GZIP格式的压缩和解压缩操作。GZIP是一种广泛使用的数据压缩格式,常用于减少网络传输的数据量,尤其是...
C语言编写的GZIP压缩算法是一项基础而重要的技术,它涉及到数据压缩、文件处理和程序设计等多个领域。GZIP是一种广泛使用的数据压缩格式,由GNU项目开发,主要用于减少文件大小,便于存储和传输。在本项目中,我们有...
在本项目中,我们将关注如何使用pako库进行gzip压缩和解压缩,并解决在处理中英文内容时可能出现的乱码问题。 首先,让我们详细了解pako库。pako是基于zlib库的一个轻量级实现,它在浏览器和Node.js环境中都能运行...
Apache 开启 Gzip 压缩网络传输减少带宽 Apache 是一个流行的开源 Web 服务器软件,它提供了许多功能来提高 Web 服务器的性能和安全性。本文将介绍如何在 Apache 中开启 Gzip 压缩功能,以减少网络传输的带宽。 ...
本项目着重介绍了如何使用pako库处理gzip压缩和解压缩,并且解决了中文字符在处理过程中的乱码问题。 gzip是一种广泛使用的数据压缩格式,它基于DEFLATE算法,常用于HTTP服务器上的文件传输以减少数据量。然而,...
在IT开发领域,提高网站性能是至关重要的,其中一种常用的方法是启用服务器的GZIP压缩,以减小网页传输的数据量,加快页面加载速度。本文主要探讨的是在IIS服务器上启用GZIP压缩针对JavaScript(js)和CSS文件无效的...
本文将深入探讨如何使用libcurl获取并解压这些经过gzip压缩的网页文件。 首先,理解libcurl的基本工作原理。libcurl是一个C语言库,提供了一系列函数接口,用于在各种协议下传输数据。对于HTTP协议,libcurl可以...
在这个场景中,我们看到一个关于“nginx-1.18.0已开启gzip压缩优化vue项目大小.zip”的压缩包,它涉及到三个主要的技术领域:Nginx、gzip压缩以及Vue Element Admin。下面我们将详细探讨这些知识点。 首先,Nginx是...
标题中的“最简单的gzip压缩”可能是指使用gzip命令行工具进行压缩的过程。在命令行界面,用户只需要输入`gzip 文件名`就能压缩指定的文件。解压gzip压缩文件同样简单,使用`gunzip 压缩文件名.gz`即可。 描述中...
以下是一个简单的示例,展示如何从Text文件写入到Gzip压缩的Text文件: ```java conf.set("mapreduce.output.fileoutputformat.compress", "true"); conf.set("mapreduce.output.fileoutputformat.compress.codec",...
gzip源码分析与GZIP压缩算法详解 在深入探讨gzip源码和其压缩算法之前,首先需要理解GZIP是什么。GZIP是一种广泛使用的数据压缩格式,主要用于文件传输和存储。它基于DEFLATE算法,该算法结合了LZ77(一种字典压缩...
在IT行业中,压缩技术是数据传输和存储时不可或缺的一部分,特别是在网络环境中,为了减少带宽消耗和加快网页加载速度,gzip压缩被广泛使用。本文将详细介绍如何在PHP环境中利用gzip进行数据压缩,涵盖两种服务器端...
在Web服务器上启用gzip压缩,可以显著降低页面的加载时间,尤其是在带宽有限的情况下,效果尤为明显。 首先,我们要准备要压缩的js和css文件,并将它们放入一个名为“gzip”的文件夹下。这样做是为了方便管理和操作...
webpack在打包时可以借助 compression webpack plugin 实现gzip压缩,首先需要安装该插件: npm i -D compression-webpack-plugin 在vue cli3.0 生成的项目里,可在 vue.config.js 中按照如下方式进行配置: 压缩...
在Delphi中,我们可以直接利用`zlib`库来处理gzip压缩,因为它支持多种压缩和解压缩格式。`zlib.123`和`zlib.128`可能是两个不同版本的Delphi封装的zlib库,可能分别对应版本号123和128,其中123版包含了一个示例...
Gzip压缩技术是一种广泛应用于互联网的数据压缩方法,其主要目的是减少数据传输量,提高网络传输效率,尤其是在HTTP协议中,Gzip编码能够显著加快网页加载速度。Gzip是由GNU项目中的开发者Jean-loup Gailly和Mark ...
Gzip压缩软件是一种广泛使用的数据压缩工具,尤其在Unix-like操作系统和Linux系统中非常常见。它的主要功能是将文件进行压缩,生成后缀为.gz的压缩文件,从而节省存储空间和提高传输效率。Gzip软件的全名是GNU zip,...
WebLogic的GZip压缩是一种优化技术,用于减少通过网络传输的数据量,特别是在Web应用程序中,可以显著提升网页加载速度和服务器性能。GZip压缩利用了HTTP协议中的Content-Encoding头,服务器在发送响应到客户端...
gzip是Linux系统中广泛使用的数据压缩工具,但在这个场景中,我们讨论的是“gzip压缩Windows版”。这是一款专为在Windows环境下使用的gzip工具,它允许用户在Windows操作系统上执行类似于Linux上的gzip压缩和解压缩...