1. CharGzipFilter过滤器类 public class CharGzipFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; MyResponse myResponse = new MyResponse(response); chain.doFilter(request,myResponse); /** * 从缓存中取出jsp输出的数据 */ byte[] data = myResponse.getData(); /** * 显示在控制台 */ System.out.println("压缩前:" + data.length + "个字节"); /** * 进行字符压缩,压缩后的字节在ByteArrayOutputStream里 */ ByteArrayOutputStream baot = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(baot); gzip.write(data); gzip.flush(); gzip.close(); /** * 从ByteArrayOutputStream里取得压缩后的数据 */ byte[] newData = baot.toByteArray(); /** * 显示在控制台 */ System.out.println("压缩后:" + newData.length + "个字节"); /** * 通知浏览器需要接收GZIP格式的压缩数据 */ response.setHeader("content-encoding","gzip"); /** * 向浏览器响应压缩后的数据 */ response.getOutputStream().write(newData); } public void init(FilterConfig filterConfig) throws ServletException { } } 2.MyResponse装饰类 /** * @author Administrator * 装饰类,让jsp页面的输出,暂不输向浏览器,而是输出到自定义的缓存中 */ class MyResponse extends HttpServletResponseWrapper{ private PrintWriter pw; private ByteArrayOutputStream baot = new ByteArrayOutputStream(); private HttpServletResponse response; public MyResponse(HttpServletResponse response) { super(response); this.response = response; } /** * 重写不满足业务需求的方式 */ public PrintWriter getWriter() throws IOException { System.out.println("jsp底层调用了我重写的getWriter方法"); //在默认情况下,向缓存中输出的字节采用widnow平台默认的编码方式,即GBK(优先)或GB2312 pw = new PrintWriter(new OutputStreamWriter(baot,"UTF-8")); System.out.println("jsp中的所有内容都输向了ByteArrayOutputStream字节数组"); return pw; } /** * 返回缓存中的数据 */ public byte[] getData(){ /** * jsp页面中的数据还在PrintWriter中,需要强行flush */ if(pw != null){ //这句话执行完后,jsp页面中的数据都会进入ByteArrayOutputStream缓存中 pw.flush(); } return baot.toByteArray(); } }