<pre class="java" name="code">
新建一个servelt,用于输出数据
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// PrintWriter pw = response.getWriter();
// pw.print("a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试a测试");
// pw.close();
OutputStream out = response.getOutputStream();
for (int i = 0; i < 50; i++) {
out.write("你好真的谢谢".getBytes("utf-8"));
}
}
}
新建一个过滤器,用于过滤上面的servlet和jsp,代码如下
public class GZipFilter2 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain doChain)
throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) response;
MyResponse2 myresp = new MyResponse2(resp);
//将包装好的response传递到下一个servlet中
doChain.doFilter(request, myresp);
//读取原生数据
byte[] src = myresp.getSrc();
//开始压缩
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(src);
gzip.close();
//使用原生的response
resp.setContentType("text/html;charset=UTF-8");
byte[] desc = out.toByteArray();
resp.setHeader("Content-Encoding", "gzip");
resp.setContentLength(desc.length);
resp.getOutputStream().write(desc);
System.out.println("原来的数据:"+src.length);
System.out.println("现在的数据:"+desc.length);
}
public void init(FilterConfig filterconfig) throws ServletException {
}
}
//压缩数据,将数据存放到内存中
class MyResponse2 extends HttpServletResponseWrapper{
//将这个容器声明为成员变量
private ByteArrayOutputStream srcByte;
private PrintWriter out ;
public MyResponse2(HttpServletResponse response) {
super(response);
}
@Override
public PrintWriter getWriter() throws IOException {
srcByte = new ByteArrayOutputStream();
out = new PrintWriter(new OutputStreamWriter(srcByte,"utf-8"));
return out;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
srcByte = new ByteArrayOutputStream();
ServletOutputStream out = new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
srcByte.write(b);
}
};
return out;
}
//提供一个方法获取原生数据
public byte[] getSrc(){
if(out!=null){
//如果不关闭的话,看不到数据
out.close();
}
return srcByte.toByteArray();
}
}
web.xml代码如下:
<filter>
<filter-name>GZipFilter2</filter-name>
<filter-class>com.yxy.filter.GZipFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>GZipFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>