import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* 描述:servletResponse包装类<br>
* 那么子类化HttpServletResponseWrapper都需要重写那些方法呢
* 获取response对象,并将输出存放在自定义的流里面,那么关于输出流(outputStream、writer)的操作都是需要重写的了:
* 1)以流的方式获取输出——重写getOutputStream()
* 2)以字符方式获取输出——重写getWriter()
* 3)刷新流——重写flushBuffer()
* 4)重置流——重写reset()
* 然后加入新增的获取输出数据的方法就ok了
* 作者:万鸿辉 <br>
* 修改日期:2012-9-19上午09:37:49 <br>
* E-mail: wanhonghui@126.com <br>
*/
public class CompressWapper extends HttpServletResponseWrapper {
private ServletOutputStream servletOutputStream;
private PrintWriter printWriter;
private GzipOutPutStream gizpStream;
public CompressWapper(HttpServletResponse response) throws IOException {
super(response);
gizpStream = new GzipOutPutStream(response.getOutputStream());
servletOutputStream = gizpStream;
printWriter = new PrintWriter(gizpStream);
}
/**
* 方法名称:flushBuffer <br>
* 描述:刷新流 <br>
* 作者:Administrator <br>
* 修改日期:2012-9-19上午09:43:34
* @see javax.servlet.ServletResponseWrapper#flushBuffer()
* @throws IOException
*/
public void flushBuffer() throws IOException {
if(servletOutputStream != null){
servletOutputStream.flush();
}
if(printWriter != null){
printWriter.flush();
}
gizpStream.close();
}
/**
* 方法名称:getOutputStream <br>
* 描述:获取字节流 <br>
* 作者:Administrator <br>
* 修改日期:2012-9-19上午09:44:01
* @see javax.servlet.ServletResponseWrapper#getOutputStream()
* @return
* @throws IOException
*/
public ServletOutputStream getOutputStream() throws IOException {
return servletOutputStream;
}
/**
* 方法名称:getWriter <br>
* 描述:获取字符流 <br>
* 作者:Administrator <br>
* 修改日期:2012-9-19上午09:44:19
* @see javax.servlet.ServletResponseWrapper#getWriter()
* @return
* @throws IOException
*/
public PrintWriter getWriter() throws IOException {
return printWriter;
}
/**
* 方法名称:reset <br>
* 描述:重置流 <br>
* 作者:Administrator <br>
* 修改日期:2012-9-19上午09:44:30
* @see javax.servlet.ServletResponseWrapper#reset()
*/
public void reset() {
try {
gizpStream.reset();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 方法名称:resetBuffer <br>
* 描述:重置流 <br>
* 作者:Administrator <br>
* 修改日期:2012-9-19上午09:44:30
* @see javax.servlet.ServletResponseWrapper#reset()
*/
public void resetBuffer() {
try {
gizpStream.reset();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
package com.chinalife.datacompress;
import java.io.IOException;
import java.util.Enumeration;
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;
/**
* 描述:通过filter进行文件压缩<br>
* 作者:万鸿辉 <br>
* 修改日期:2012-9-19上午09:11:22 <br>
* E-mail: wanhonghui@126.com <br>
*/
public class FileCompressFilter implements Filter{
/**
* 方法名称:destroy <br>
* 描述:过滤器销毁方法 <br>
* 作者:万鸿辉 <br>
* 修改日期:2012-9-19上午09:15:33
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
/**
* 方法名称:doFilter <br>
* 描述:通过过滤器来拦截请求,压缩对应的文件,通过gzip算法进行压缩处理 <br>
* 作者:万鸿辉 <br>
* 修改日期:2012-9-19上午09:21:36
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
CompressWapper wapper = new CompressWapper(response);
Enumeration<String> enumer =request.getHeaders("Accept-Encoding"); //通过名称获取请求头信息
boolean isBrowserCompress = false; //浏览器是否支持gzip压缩
while(enumer.hasMoreElements()){
String acceptEncoding = enumer.nextElement();
if(acceptEncoding.indexOf("gzip") != -1){
isBrowserCompress = true;
}
}
//如果浏览器支持,则进行文件压缩
if(isBrowserCompress){
response.addHeader("Content-Encoding", "gzip");
filterChain.doFilter(servletRequest, wapper);
wapper.flushBuffer();
}
//如果浏览器不支持,则直接放行
else{
filterChain.doFilter(servletRequest, servletResponse);
}
}
/**
* 方法名称:init <br>
* 描述:过滤器初始化方法 <br>
* 作者:万鸿辉 <br>
* 修改日期:2012-9-19上午09:15:07
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
* @param filterConfig
* @throws ServletException
*/
public void init(FilterConfig filterConfig) throws ServletException {
}
}
package com.chinalife.datacompress;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletOutputStream;
/**
* 描述:对数据压缩流<br>
* 作者:Administrator <br>
* 修改日期:2012-9-19上午09:52:11 <br>
* E-mail: <br>
*/
public class GzipOutPutStream extends ServletOutputStream {
private GZIPOutputStream gzipstStream;
private OutputStream stream ;
public GzipOutPutStream(OutputStream stream) throws IOException {
this.stream = stream;
reset();
}
public void write(int b) throws IOException {
gzipstStream.write(b);
}
public void write(byte[] b) throws IOException {
gzipstStream.write(b,0,b.length);
}
public void write(byte[] b, int off, int len) throws IOException {
gzipstStream.write(b, off, len);
}
public void flush() throws IOException {
gzipstStream.flush();
}
public void close() throws IOException {
gzipstStream.close();
}
public void reset() throws IOException{
gzipstStream = new GZIPOutputStream(stream);
}
}
<filter>
<filter-name>fileFilter</filter-name>
<filter-class>com.chinalife.datacompress.FileCompressFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>fileFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>