应用HttpServletResponseWrapper对象,压缩响应正文内容。
思路:通过filter向目标页面传递一个自定义的response对象。
在自定义的response对象中,重写getOutputStream方法和getWriter方法,使目标资源调用此方法输出页面内容时,获得的是我们自定义的ServletOutputStream对象。
在我们自定义的ServletOuputStream对象中,重写write方法,使写出的数据写出到一个buffer中。
当页面完成输出后,在filter中就可得到页面写出的数据,从而我们可以调用GzipOuputStream对数据进行压缩后再写出给浏览器,以此完成响应正文件压缩功能。
Servlet API中提供了response对象的Decorator设计模式的默认实现类++HttpServletResponseWrapper++,以避免用户在对response对象进行增强时需要实现response接口中的所有方法。
压缩代码
String data = "aaaaaaaa";
ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(bout);
gout.write(data.getBytes());
gout.close();
byte gzip[] = bout.toByteArray();
response.setHeader("content-encoding", "gzip");
response.setHeader("content-length", gzip.length +