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 

效果还是非常出色的.

 

 

还有一种方式就是在tomcat 前面安装一个nginx

 

所有的请求都是通过nginx  转发到tomcat ,这样的话 nginx 就可以在中间对数据进行修改

开启的方式也是非常的简单

在http 代码块中 加上

 

 

gzip on;

 

即可

 

 

 

 

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值