网站GZIP压缩

/**
 * cn.jbit.filter.GZIPFilter
 * GZIP数据压缩过滤器
 * 2014-2-17
 */
package cn.jbit.filter;

import java.io.IOException;
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 doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;

		String ae = request.getHeader("Accept-Encoding");
		System.out.println(ae);
		if (null != ae && ae.indexOf("gzip") != -1) {
			// 创建响应对象包装类
			GZIPResponseWrapper wrappedResponse = new GZIPResponseWrapper(
					response);
			chain.doFilter(request, wrappedResponse);
			// 释放资源
			wrappedResponse.finishResponse();
		} else {
			chain.doFilter(req, resp);
		}
	}

	public void init(FilterConfig filterConfig) throws ServletException {
	}

	public void destroy() {
	}
}

package cn.jbit.filter;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class GZIPResponseWrapper extends HttpServletResponseWrapper {
	protected HttpServletResponse wrappedResponse;
	protected ServletOutputStream stream = null;
	protected PrintWriter writer = null;

	public GZIPResponseWrapper(HttpServletResponse response) {
		super(response);
		wrappedResponse = response;
	}

	/**
	 * 创建输出流
	 * 
	 * @return Servlet输出流
	 * @throws IOException
	 */
	public ServletOutputStream createOutputStream() throws IOException {
		return new GZIPResponseStream(wrappedResponse);
	}

	/**
	 * 释放响应资源
	 */
	public void finishResponse() {
		try {
			if (null != writer) {
				writer.close();
			} else {
				if (null != stream) {
					stream.close();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 刷新缓存
	 */
	public void flushBuffer() throws IOException {
		stream.flush();
	}

	/**
	 * 获取Servlet输出流
	 */
	public ServletOutputStream getOutputStream() throws IOException {
		if (null != writer) {
			throw new IllegalStateException(
					"getWriter() has already been called!");
		}
		if (null == stream)
			stream = createOutputStream();
		return stream;
	}

	/**
	 * 获取文本输出流对象
	 */
	public PrintWriter getWriter() throws IOException {
		if (null != writer) {
			return writer;
		}

		if (null != stream) {
			throw new IllegalStateException(
					"getOutputStream() has already been called!");
		}

		stream = createOutputStream();
		writer = new PrintWriter(new OutputStreamWriter(stream, "UTF-8"));
		return writer;
	}
}

package cn.jbit.filter;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

public class GZIPResponseStream extends ServletOutputStream {
	protected ByteArrayOutputStream baos;// 二进制数组输出流
	protected GZIPOutputStream gzipstream;// GZIP输出流
	protected boolean closed;// 是否关闭
	protected HttpServletResponse response;
	protected ServletOutputStream output;

	public GZIPResponseStream(HttpServletResponse response) throws IOException {
		super();
		closed = false;
		this.response = response;
		output = response.getOutputStream();
		baos = new ByteArrayOutputStream();
		gzipstream = new GZIPOutputStream(baos);// 二进制数组输出流通过GZIP装饰
	}

	/**
	 * 释放资源
	 */
	public void close() throws IOException {
		if (closed) {
			throw new IOException("This output stream has already been closed");
		}
		gzipstream.finish();// 压缩数据写入输出流
		gzipstream.flush();// 刷新缓存
		gzipstream.close();// 关闭GZIP输出流
		byte[] bytes = baos.toByteArray();
		response.setContentLength(bytes.length);// 设置内容长度
		response.addHeader("Content-Encoding", "gzip");// 设置内容编码

		output.write(bytes);
		output.flush();
		output.close();
		closed = true;
	}

	/**
	 * 刷新缓存
	 */
	public void flush() throws IOException {
		if (closed) {
			throw new IOException("Cannot flush a closed output stream");
		}
		gzipstream.flush();
	}

	/**
	 * 写入指定的字节
	 */
	public void write(int b) throws IOException {
		if (closed) {
			throw new IOException("Cannot write to a closed output stream");
		}
		gzipstream.write((byte) b);
	}

	/**
	 * 写入指定byte数组中从偏移量off开始的len个字节
	 */
	public void write(byte[] b, int off, int len) throws IOException {
		if (closed) {
			throw new IOException("Cannot write to a closed output stream");
		}
		gzipstream.write(b, off, len);
	}

	/**
	 * 写入指定byte数组
	 */
	public void write(byte[] b) throws IOException {
		write(b, 0, b.length);
	}

	/**
	 * 关闭
	 * 
	 * @return 是否关闭 false 没有关闭,true 关闭
	 */
	public boolean closed() {
		return this.closed;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值