您的位置:首页 > 编程语言

全站压缩代---练习代码

2013-05-19 23:02 316 查看
package com.elomo.filter;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
//全站压缩过滤器
public class GzipFilter implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {

}

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response =(HttpServletResponse)res;
//包装response,将输出流存到缓存中用
GzipHttpServletResponse gresponse = new GzipHttpServletResponse(response);
chain.doFilter(request, gresponse);
//这里是压缩代码
//找到一个内存缓冲字节流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//把数据压缩到字节缓冲流中
GZIPOutputStream gout = new GZIPOutputStream(baos);
//取出数据,压缩后的
byte[] b= gresponse.getOldBytes();
System.out.println("原始数据大小:"+b.length);
gout.write(b);
gout.close();//保证所有的数据都进字节缓冲流中。

//取出压缩后的数据
b = baos.toByteArray();
System.out.println("压缩数据大小:"+b.length);
//通知客户端压缩方式
response.setHeader("Content-Encoding", "gzip");
response.setContentLength(b.length);
//服务器的响应输出
ServletOutputStream out = response.getOutputStream();
out.write(b);

}

public void destroy() {

}

}

class GzipHttpServletResponse extends HttpServletResponseWrapper{
private ByteArrayOutputStream baos= new ByteArrayOutputStream();
private PrintWriter pw;
public GzipHttpServletResponse(HttpServletResponse response) {
super(response);
}

//把原始数据存放到一个缓冲流中
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOutputStream(baos);
}

//字符流:把原始的数据封装到一个缓冲流中
@Override
public PrintWriter getWriter() throws IOException {
pw = new PrintWriter(new OutputStreamWriter(baos,super.getCharacterEncoding()));
return pw;
}

// 返回baos中的缓冲数据:原始
public byte[] getOldBytes(){
try {
if(pw!=null)
pw.close();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return baos.toByteArray();
}
}

class MyServletOutputStream extends ServletOutputStream{
private ByteArrayOutputStream baos;
public MyServletOutputStream(ByteArrayOutputStream baos){
this.baos = baos;
}
@Override
public void write(int b) throws IOException {
baos.write(b);
}

}
最后,不要忘记在web.XML中配置一下哈!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: