热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringmvcGzip压缩前后端交流的String

因项目的需要,需要对前后端传输的数据进行压缩,使用的压缩方式是GZIPGzip压缩会把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   找到 如下的标签  添加如下内容:


 



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

打开fidder,开下效果:


如果不压缩,看下多大:



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

效果还是非常出色的.






推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
author-avatar
qixian0392_648
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有