java过滤器实现Gzip压缩实例源码教程
java过滤器实现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中做相应的配置。
写之记录记录。。。留给日后用。。。。写给有需要的人。。。