- package cn.edu.itcast.filter;
- 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.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{
- @Override
- public void init(FilterConfig arg0) throws ServletException {
- }
- @Override
- public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest)req ;
- HttpServletResponse response = (HttpServletResponse)res ;
- GzipHttpServletResponse gzipResponse = new GzipHttpServletResponse(response) ;
- chain.doFilter(request, gzipResponse) ;
- // 找一个内存缓冲字节流
- ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
- // 把数据压缩到缓冲字节流中
- GZIPOutputStream out = new GZIPOutputStream(baos) ;
- // 取出数据原始字节
- byte[] bs = gzipResponse.getOldBytes() ;
- System.out.println("原始数据大小="+bs.length);
- out.write(bs) ;
- out.close() ;
- // 取出压缩后的数据
- bs = baos.toByteArray() ;
- System.out.println("压缩后的数据大小="+bs.length);
- // 告知客户端压缩格式和文件长度
- response.setHeader("Content-Encoding", "gzip");
- response.setContentLength(bs.length) ;
- ServletOutputStream so = response.getOutputStream() ;
- so.write(bs) ;
- }
- @Override
- 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 MyServletOutStream(baos) ;
- }
- @Override
- public PrintWriter getWriter() throws IOException {
- pw = new PrintWriter(new OutputStreamWriter(baos, super.getCharacterEncoding())) ;
- return pw ;
- }
- public byte[] getOldBytes(){
- if(pw != null){
- pw.close() ;
- }
- try {
- baos.flush() ;
- } catch (IOException e) {
- e.printStackTrace();
- }
- return baos.toByteArray() ;
- }
- }
- class MyServletOutStream extends ServletOutputStream{
- private ByteArrayOutputStream baos ;
- public MyServletOutStream(ByteArrayOutputStream baos){
- this.baos = baos ;
- }
- @Override
- public void write(int b) throws IOException {
- baos.write(b) ;
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/2412201514288.html
来源: http://www.codesnippet.cn/detail/2412201514288.html