模糊知识点之通过过滤器实现Gzip压缩

Gzip是若干种文件压缩程序的简称,我们这里来实现通过javaee中的filter实现对响应数据的压缩,高效的传到客户端,那么是怎么通过Gzip压缩实现的将数据压缩后客户端的,对步骤进行分析:

1.我们把客户端要对用户响应的数据先放在缓存中,

2.然后,通过Gzip将缓存中的数据压缩,

3.在过滤器中通过response的写方法,将数据响应到客户端。


为了模拟:

首先写一个请求的servlet:

package com.zsq.gzip;

import java.io.IOException;
import java.io.PrintWriter;

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

public class GzipServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		String s="sadgjassssssssssssssssssssssssssssssssssssssss" +
				"ssssssaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaa" +
				"saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaa" +
				"assssssssssssssssssssssssssssssssssssssssssaa不是吧";
		//response.getOutputStream().write(s.getBytes("utf-8"));
		response.getWriter().write(s);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
				doGet(request, response);
	}

}

下面是一个过滤器:

package com.zsq.gzip;

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

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GzipFilter implements Filter{

	public void destroy() {
			System.out.println("压缩过滤开始了");		
	}

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest request=(HttpServletRequest)req;
		HttpServletResponse response=(HttpServletResponse)res;
		MyResponse mresponse=new MyResponse(response);
		chain.doFilter(request, mresponse);
		byte[] b=mresponse.getBytes();
		System.out.println("压缩前:"+b.length);
		ByteArrayOutputStream out=new ByteArrayOutputStream();
		
		GZIPOutputStream gzipOutputStream=new GZIPOutputStream(out);
		gzipOutputStream.write(b);
		gzipOutputStream.close();//将数据刷出,如果没有则不显示
		
		byte[]bu=out.toByteArray();
		System.out.println("压缩后:"+bu.length);
		response.setHeader("Content-Encoding","gzip");
		response.getOutputStream().write(bu);
		
		
		
	}

	public void init(FilterConfig filterConfig) throws ServletException {

		System.out.println("压缩过滤结束了。");
	}

}

其中有一个自定义类MyResponse,这个类是对Response的增强类,具体增强的是getOutputStream()和getWriter()这两个方法,通过对这两个方法将数据写到ByteArrayOutputStream中,而不是打印到页面,然后向外提供一个接口得到这个ByteArrayOutputStream对象,通过Gzip压缩,然后响应到客户端;该类的代码:

package com.zsq.gzip;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class MyResponse extends HttpServletResponseWrapper{

	private ByteArrayOutputStream bytes=new ByteArrayOutputStream();//用bytes保存数据
	private HttpServletResponse response;
	
	private PrintWriter pw;
	public MyResponse(HttpServletResponse response) {
		super(response);
		// TODO Auto-generated constructor stub
		this.response=response;
	}
	
	@Override
	public ServletOutputStream getOutputStream(){
		return new MyServletOutputStream(bytes);//调用自定义类将数据写到bytes中
	}
	
	@Override
	public PrintWriter getWriter(){
		
		try {
			pw=new PrintWriter(new OutputStreamWriter(bytes,"utf-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return pw;
	}
	
	
	public byte[] getBytes(){//向外提供一个接口得到bytes数据。
		if(pw!=null){
			pw.close();
			return bytes.toByteArray();
		}
		
		if(bytes!=null){
			try {
				bytes.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return bytes.toByteArray();
	}

}
class MyServletOutputStream extends ServletOutputStream{
	private ByteArrayOutputStream stream;
	public MyServletOutputStream(ByteArrayOutputStream stream){
		this.stream=stream;
	}
	@Override
	public void write(int b) throws IOException {
		// TODO Auto-generated method stub
		stream.write(b);//将数据写到stream中
	}
	
}


web.xml中的配置:

<filter>
		<filter-name>GzipFilter</filter-name>
		<filter-class>com.zsq.gzip.GzipFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>GzipFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>



程序运行截图:



后台打印的结果:




当然这只是为了回顾知识点的,我这个过滤的路径是 /*,一般我们只需要过滤的是:

                              1./*.jsp;

                              2./*.css;

                              3. /*.js

                              4./*.html;

                              5./*.htm

这五种,我们可以在web.xml中做相应的配置。



GZIP是网站压缩加速的一种技术,对于开启后可以加快我们网站的打开速度,原理是经过服务器压缩,客户端浏览器快速解压的原理,可以大大减少了网站的流量。1.什么是GZIP答:GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的.2.开GZIP有什么好处?答:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。


写之记录记录。。。留给日后用。。。。写给有需要的人。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值