javaEE之------GZIP全站压缩

GZIP全站压缩

将压缩后的文本文件,发送给浏览器,减少流量

GZIP压缩的条件

设置头文件协议:

	myresp.setHeader("Content-Encoding", "gzip");
	myresp.setContentLength(src.length);

两个主要的类:ByteArrayOutputStream,GZIPOutputStream

采用包装模式对respone加强

主要流程:

共存在两种流,字节流outputStream和字符流PrintWriter

我们需要对respone对象里面的这两种流进行加强,(就是利用包装设计模式,修改两种流的写操作)

过滤器:

将response分装好了之后,传到后台读取数据,全部放到我们定义的ByteArrayOutputStream中,然后从中拿出数据进行压缩。采用原装的发送到前台。

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {

		HttpServletResponse resp=(HttpServletResponse) response;
		Myresponse myresp =new Myresponse(resp);//采用增强类传过去,直接写在里面

		chain.doFilter(request, myresp);

		//在返回的时候进行压缩就可以了

		//首先获得源数据
		ByteArrayOutputStream bout=myresp.getBout();
		//转成字节数据----zip写需要

		byte[] src=bout.toByteArray();
		System.out.println("压缩前"+src.length);//统计数量
		ByteArrayOutputStream baout =new ByteArrayOutputStream();
		GZIPOutputStream zip =new GZIPOutputStream(baout);
		//源数据压缩之后写到内存流中baout中
		zip.write(src);
		//关闭流
		zip.close();

		//设置http协议
		myresp.setHeader("Content-Encoding", "gzip");
		myresp.setContentLength(src.length);

		byte[] desc=baout.toByteArray();
		System.out.println("压缩之后"+desc.length);
		OutputStream out =resp.getOutputStream();//字符流压缩之后必须以字符流去写
		out.write(desc);
	}

加强类Myresponse(包装模式)

分别写字节流函数的getOutputStream()字符流的getWriter()

//这是增强类,必须包括两个字符流和字节流
class Myresponse extends HttpServletResponseWrapper{
	private PrintWriter pw;
	ByteArrayOutputStream bout;

	public Myresponse(HttpServletResponse response) {
		super(response);
	}

	//字符流,字节写一个类,自己写write函数,写到bout中
	public ServletOutputStream getOutputStream() throws IOException {
		bout=new ByteArrayOutputStream();//每次都需要新的容器。
		return new Myout(bout);
	}

	//字符流的处理,字符流和字节不同,字符流可以实现IO直接的套接,不能单独写
	public PrintWriter getWriter() throws IOException {
		bout=new ByteArrayOutputStream();//每次都需要新的容器。
		pw= new PrintWriter(new OutputStreamWriter(bout, "utf-8"), true);
		//直接通过流套接写到内存流,比字节流简单
		return pw ;
	}

	//最后还是需要将这个容器返回出去
	public ByteArrayOutputStream getBout() {
		if(pw!=null){
			pw.close();//字符流必须刷新,否则得不到数据
		}
		return bout;
	}
}

字节流需要从写write函数

构造传参,就bout传到这边进行写操作

/这是字节流的写功能,,,因为printwriter里面可以进行流套接,所以不用另外写一个自己写
 class Myout extends ServletOutputStream {
	ByteArrayOutputStream bout;
	public Myout(ByteArrayOutputStream bout) {
		this.bout=bout;
	}

	@Override
	public void write(int b) throws IOException {
		bout.write(b);//需要写到内存流里面去
	}
}

在超链接的serlvet中我们用了一个测试案例

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String str="深刻的骄傲是快乐卡死的快乐撒娇的快乐按键的快乐相处了卡女你说v看见了可那是卡了哪算可怜的那是啥 垃圾都快来asd萨里看到你撒看多了就三次奥斯卡多久";//随便输入的。。。。
//		response.getWriter().write(str);
		/*
		OutputStream out=response.getOutputStream();
		byte[] b =str.getBytes("utf-8");
		out.write(b);
		//字节字符都可以的
		*/
		PrintWriter pw =response.getWriter();
		pw.write(str);
	}

当启动服务器是,会拦截压缩,index.jsp

访问超链接到servlet时候,也会压缩

压缩的效率是越大,压缩效率越高。。。

上面的就是过滤器需要实现的功能,可以通过字节,也可以过滤字符,可以实现压缩全站的功能,具体需要压缩什么,可以去web.xml中去配置。(我这里是拦截全部)

时间: 2024-11-05 11:39:43

javaEE之------GZIP全站压缩的相关文章

JavaWeb-过滤器Filter学习(五)全站压缩

全站压缩,最大的好久就是帮客户端节省流量. 数据压缩,我们需要用到二个Java类,也就是java.util.zip 中的 类 GZIPOutputStream 此类为使用 GZIP 文件格式写入压缩数据实现流过滤器. java.io 类 ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组.缓冲区会随着数据的不断写入而自动增长.可使用 toByteArray() 和 toString() 获取数据. 我们利用GZIPOutputStream(Ou

全站压缩

import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.zip.GZIPOutputStream; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servle

压缩字符流和字节流和全站压缩过滤器

1 public static void main(String[] args) throws Exception { 2 ByteArrayOutputStream bos = new ByteArrayOutputStream(); //字符流 3 OutputStreamWriter osw = new OutputStreamWriter(bos); 4 PrintWriter pw = new PrintWriter(osw); 5 pw.write("helloworld"

【Java EE 学习第19天】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】

一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: (1)使用GZIPOutputStream工具对数据进行压缩,中间借助了ByteArrayOutputStream类进行结果的存储. (2)使用过滤器对浏览器请求进行拦截,通过自定义HttpServletResponse类(使用包装模式),重写getWriter方法,使得写出的目的地转变成ByteA

全站压缩过滤器

1.网站压缩的一个简单示例 public class ServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

JavaWeb 后端 <十二> 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器

一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤 二.编写步骤和执行过程 1.编码步骤: a.编写一个类:实现javax.servlet.Filter接口 public class FilterDemo1 implements Filter { public FilterDemo1(){ System.out.println("调用了默认的构造方法"); } //用户每次访

Android之Gzip/Zip压缩

前言: 做过Android网络开发的都知道,在网络传输中我们一般都会开启GZIP压缩,但是出于刨根问底的天性仅仅知道如何开启就不能满足俺的好奇心的,所以想着写个demo测试一下比较常用的两个数据压缩方式,GZIP/ZIP压缩. 首先认识一下GZIP压缩 GZIP是网站压缩加速的一种技术,对于开启后可以加快我们网站的打开速度,原理是经过服务器压缩,客户端浏览器快速解压的原理,可以大大减少了网站的流量.GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压

用pigz代替gzip -- 并行压缩软件

用pigz代替gzip By yejr on 03 十二月 2012 pig是个啥东东?官网:http://zlib.net/pigz一句话简介: A parallel implementation of gzip for modernmulti-processor, multi-core machines. 简单的说,就是支持并行的gzip.废话不多说,开始测试. pig默认用当前逻辑cpu个数来并发压缩,无法检测个数的话,则并发8个线程. 一.测试压缩包文件1 压缩前 -rw-r--r--

Nginx使用GZIP来压缩网页

HTTP协议上的GZIP编码是一种用来改进web应 用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度.这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果 就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的. 减少文件大小有两个明显的好处,一是可以减少存储空间,二是