/**
* 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;
}
}