Spring mvc Gzip压缩 前后端交流的String

因项目的需要,需要对前后端传输的数据进行压缩,使用的压缩方式是GZIP

Gzip压缩会把String压缩成一大推乱码,但是这个过程对用户而言是透明的,浏览器会自动的对压缩的内容进行解析,所以用户看到的还是正常的内容.

  使用纯servlet 进行压缩测试非常的简单.

package com.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Test")
public class Test extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		
		response.setCharacterEncoding("utf-8");
		
		request.setCharacterEncoding("gbk");
		response.setContentType("text/html;charset=gbk"); 
		 response.addHeader("Content-Encoding", "gzip");  
		
		PrintWriter out=new PrintWriter (new GZIPOutputStream (response.getOutputStream()));		
		
		 
		//PrintWriter out=response.getWriter();
		out.write("哈哈哈哈哈");
		
		out.close();  //记住这一句很重要,要不然没办法显示
		
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


浏览器开F12

直接访问



可以看到使用了Gzip 压缩,长度是25(ps:未压缩长度是10,有兴趣的可以试一试)

所以小文本压缩,不见得有优势

可能有的人说,我就想看看 他压缩成什么样子了,可以!!只不过要装个软件 fidder

打开软件 再访问一次


这个时候就可以看到 压缩后的数据了,只不过我们的浏览器比较的智能,自动帮你再解压了,所以对用户透明



下面切换到重点,现在用纯servlet开发的人少了,大家都喜欢用框架了,就拿比较流行的springmvc距离,基本上都搞注解了


其中前后端传递文本的注解是@ResponseBody


加上这个注解,直接返回String,返回的内容就会显示在浏览器上


为什么函数上一个注解 就可以做到了? 仔细想想,应该是SpringMvc接管了response.getOutputStream(),自动帮我们填充String内容进去,然后前端就能看到


问题是我们使用gzip压缩,就要对response.getOutputStream()进行包装,两个冲突了


如果还像纯servlet写的话,就会报错:GZip 头中的幻数不正确。请确保正在传入 GZip 流


其实我们可以换一张思路,springmvc接管了response.getOutputStream(),但是springmvc还要在tomcat里面运行啊,


直接对tomcat修改不就ok 了.试了一下果然可以.


并且只要修改一个文件,其他的代码都不需要修改,保持原样即可


只要修改 %TOMCAT_HOME%/conf/server.xml   找到 如下的标签  添加如下内容:


<Connector port="80" protocol="HTTP/1.1"   
           connectionTimeout="20000"   
           redirectPort="8443" executor="tomcatThreadPool" URIEncoding="utf-8"   
                       compression="on"   
                       compressionMinSize="50" noCompressionUserAgents="gozilla, traviata"   
                       compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" /> 



这回用一串大的String来进行测试

打开fidder,开下效果:


如果不压缩,看下多大:



3232byte压缩到1088 byte 压缩了2/3 

效果还是非常出色的.





版权声明:本文为a897180673原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a897180673/article/details/79009261

智能推荐

Springboot整合rabbitMQ

依赖: 配置文件application.yml RabbitConfig 消息生产者RabbitProducer 消息消费者RabbitCustomer 通过Controller进行调用 启动项目后调用接口: 结果:...

Thread.join()方法的使用

如果一个线程A执行了thread.join()语句,代表当前线程A等待thread线程终止后才从thread.join()方法返回 并且这个方法具有超时特性,可以添加参数设置 输出结果: jdk中Thread.join()方法的源码(进行了部门调整)   每个线程终止的条件是前驱线程的终止,每个线程等待前驱线程终止后,才从join()方法返回,  当线程终止时,会调用自身的no...

linux服务器部署jenkins笔记

安装jenkins参考文档:https://blog.csdn.net/tomatocc/article/details/83930714 1. 打开jenkins官网:https://jenkins.io/download/ 将war包下载到本地 **ps:**这里要注意的是要下载左边下方的war包,不要下载右边下面的war包。左边是稳定版本,右边是最新版本,建议大家使用稳定版本(我刚开始下载的...

k8s部署elasticsearch集群

百度营销大学     环境准备 我们使用的k8s和ceph环境见: https://blog.51cto.com/leejia/2495558 https://blog.51cto.com/leejia/2499684 ECK简介 Elastic Cloud on Kubernetes,这是一款基于 Kubernetes Operator 模式的新型编排产品,用户可使用该产品在...

saas-export项目-AdminLTE介绍与入门

AdminLTE介绍 (1)AdminLTE是什么? AdminLTE是一款建立在bootstrap和jquery之上的开源的模板主题工具 (2)AdminLTE有什么特点? 提供一系列响应的、可重复使用的组件, 并内置了多个模板页面 自适应多种屏幕分辨率,兼容PC和移动端 快速的创建一个响应式的Html5网站 AdminLTE 不但美观, 而且可以免去写很大CSS与JS的工作量 AdminLTE...

猜你喜欢

MyBatis中ResultMap结果集映射

用于解决属性名和字段名不一致的情况: resultMap 元素是 MyBatis 中最重要最强大的元素。...

编写一个shell

编写shell的过程: 1.从标准输入中读入一个字符串。 2.解析字符串 3.创建一个子进程的执行程序。 4.子进程程序替换。 5.父进程等待子进程退出。...

WEB自动化测试中Xpath定位方法

前言: Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。 一  路径表达式: 路径以“/”开始     表示找到满足该绝对路径的元素; 路径以//”开始  ...

力扣困难难度 第4题 寻找两个正序数组的中位数

先看一眼题 我的思路: 设置下标i,j分别用于遍历两个数组,初始值均为0,直到找到两个数组中从小到大的第第length/2个数为止结束循环,length为两个数组长度之和。 ·每次比较nums[i]nums[j],如果前者小则i++,否则j++ ·循环结束时,如果count已经达到length/2,则说明已经找到了中位数,[注意:此时有可能正好其中一个数组遍历完了!所以...

[国家集训队]小Z的袜子(莫队)

[国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这NN只袜子从1到NN编号,然后从编号LL到RR(LL 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同...