[java]代码库
package cn.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.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 destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//要想压缩页面 就是当用户访问页面时 在服务器把页面信息打给浏览器的时候进行压缩 所以这时候就是对response进行包装
MyResponse myresponse = new MyResponse((HttpServletResponse) response);
chain.doFilter(request, (ServletResponse) myresponse);
//从包装的myresponse里获得写到容器流里的原始数据bs
byte[] bs = myresponse.getOut();
System.out.println("压缩前>>>"+bs.length);
//用原始的response响应用户,此response需要转换为HttpServletResponse类型
HttpServletResponse resp = (HttpServletResponse) response;
//response解决中文乱码问题
resp.setContentType("text/html;charset=utf-8");
//开始压缩
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream zip = new GZIPOutputStream(out);
zip.write(bs);
zip.close();
//获取压缩后的数据
byte[] dest = out.toByteArray();
System.out.println("压缩后>>>"+dest.length);
//设置响应头
resp.setDateHeader("content-length", dest.length);
resp.setHeader("content-Encoding", "gzip");
resp.getOutputStream().write(dest);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
class MyResponse extends HttpServletResponseWrapper{
private ByteArrayOutputStream out = new ByteArrayOutputStream();//定义一个容器
public MyResponse(HttpServletResponse response) {
super(response);
}
//重写父类的getwriter方法
PrintWriter writer;
@Override
public PrintWriter getWriter() throws IOException {
//写到一个容器流里 ,
writer = new PrintWriter(new OutputStreamWriter(out,"utf-8"), true);
return writer;
}
//提供一个获得流里内容的方法 因为用字符流写到容器里的,有缓冲区,所以在取出流里的数据时判断字符流是否关闭
public byte[] getOut(){
if(writer!=null){
writer.close();
}
return out.toByteArray();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<filter>
<filter-name>GZIP</filter-name>
<filter-class>cn.itcast.filter.GZIPFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GZIP</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
//该片段来自于http://yuncode.net