全站压缩代---练习代码
2013-05-19 23:02
316 查看
package com.elomo.filter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; 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 init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response =(HttpServletResponse)res; //包装response,将输出流存到缓存中用 GzipHttpServletResponse gresponse = new GzipHttpServletResponse(response); chain.doFilter(request, gresponse); //这里是压缩代码 //找到一个内存缓冲字节流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //把数据压缩到字节缓冲流中 GZIPOutputStream gout = new GZIPOutputStream(baos); //取出数据,压缩后的 byte[] b= gresponse.getOldBytes(); System.out.println("原始数据大小:"+b.length); gout.write(b); gout.close();//保证所有的数据都进字节缓冲流中。 //取出压缩后的数据 b = baos.toByteArray(); System.out.println("压缩数据大小:"+b.length); //通知客户端压缩方式 response.setHeader("Content-Encoding", "gzip"); response.setContentLength(b.length); //服务器的响应输出 ServletOutputStream out = response.getOutputStream(); out.write(b); } public void destroy() { } } class GzipHttpServletResponse extends HttpServletResponseWrapper{ private ByteArrayOutputStream baos= new ByteArrayOutputStream(); private PrintWriter pw; public GzipHttpServletResponse(HttpServletResponse response) { super(response); } //把原始数据存放到一个缓冲流中 @Override public ServletOutputStream getOutputStream() throws IOException { return new MyServletOutputStream(baos); } //字符流:把原始的数据封装到一个缓冲流中 @Override public PrintWriter getWriter() throws IOException { pw = new PrintWriter(new OutputStreamWriter(baos,super.getCharacterEncoding())); return pw; } // 返回baos中的缓冲数据:原始 public byte[] getOldBytes(){ try { if(pw!=null) pw.close(); baos.close(); } catch (IOException e) { e.printStackTrace(); } return baos.toByteArray(); } } class MyServletOutputStream extends ServletOutputStream{ private ByteArrayOutputStream baos; public MyServletOutputStream(ByteArrayOutputStream baos){ this.baos = baos; } @Override public void write(int b) throws IOException { baos.write(b); } }最后,不要忘记在web.XML中配置一下哈!
相关文章推荐
- 解决全站乱码--练习代码
- 动态代理练习2-全站压缩流输出[response动态代理]
- 动态代理练习2-全站压缩流输出[response动态代理]
- 用java流 压缩文件与解压缩文件代码
- 4.2、Android Studio压缩你的代码和资源
- 代码练习在 C# 中得到一个 object (包含匿名对象)的属性和属性值
- 前端代码进行图像压缩
- 黑马程序员 ----------- 代码练习
- 整理,压缩代码的在线工具
- 比较的简单的二叉树的练习代码(纯属娱乐)
- HTML-DEV-ToolLink(常用的在线字符串编解码、代码压缩、美化、JSON格式化、正则表达式、时间转换工具、二维码生成与解码等工具,支持在线搜索和Chrome插件。)
- wxPython入门练习代码 四
- webpack2-minifying(压缩代码)
- 【C代码练习14】水仙花数
- 查询练习代码
- 指针与数组代码练习
- 安卓UI练习(一)--登陆界面和逻辑代码
- 《Android 群英传》 阅读笔记 第十章~第十二章(附练习代码)
- Grails示例程序-用代码实现将文件压缩后下载
- java基础代码练习