全站GZIP压缩过滤器
来源:互联网 发布:winscp网络错误被拒绝 编辑:程序博客网 时间:2024/05/29 05:53
前几天想在项目中添加个gzip压缩的过滤器,然后压缩数据,提高访问效率,当时。。。好像压缩得不太好,之前在Servlet中压缩还是挺好的,在三大框架整合中就用的不太好,可能是因为我用框架不熟的原因,最后,还是设置了tomcat的压缩,以下是代码。
/* * 全站压缩过滤器 * GZip */public class GZipFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest request= (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;MyResponseWrapper myresponse = new MyResponseWrapper(response);// 将自己包装过的Response传递下去,便于获取写入的数据来压缩chain.doFilter(request,myresponse );byte[] buff = myresponse.getBuffer();System.out.println("原始长度:"+buff.length);// 压缩后的数据暂存在bout中ByteArrayOutputStream bout = new ByteArrayOutputStream();// 使用GZIP压缩GZIPOutputStream gout = new GZIPOutputStream(bout);gout.write(buff);gout.close();byte[] gzipBuffer = bout.toByteArray();System.out.println("压缩后的长度:"+gzipBuffer.length);// gzip压缩方式response.setHeader("content-encoding", "gzip");// 数据大小response.setContentLength(gzipBuffer.length);response.getOutputStream().write(gzipBuffer);}@Overridepublic void destroy() {}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}}/** * 包装Response,使得后面使用的流的数据全部写入自己的缓存冲。 * 便于压缩 */class MyResponseWrapper extends HttpServletResponseWrapper{private PrintWriter pw = null;private ByteArrayOutputStream bout = new ByteArrayOutputStream();private HttpServletResponse response;public MyResponseWrapper(HttpServletResponse response) {super(response);this.response = response;}@Overridepublic ServletOutputStream getOutputStream() throws IOException {//压缩字节数据设置return new MyServletOutputStream(bout);}/** * 当调用getWriter方法时候实际上是写入到了自己指定的缓存中 * @return * @throws IOException */@Overridepublic PrintWriter getWriter() throws IOException {//设置字符数据压缩,如果不指定编码,默认以gb2312输出,会出现乱码问题pw = new PrintWriter(new OutputStreamWriter(bout,this.response.getCharacterEncoding()));return pw;}/** * 将缓存中的数据取出,返回 * @return */public byte[] getBuffer(){if(pw != null){pw.close();}if(bout != null){try {bout.close();return bout.toByteArray();} catch (IOException e) {e.printStackTrace();}}return null;}}/** * 包装,复写其中的方法,原理同上 */class MyServletOutputStream extends ServletOutputStream{private ByteArrayOutputStream bout ;public MyServletOutputStream(ByteArrayOutputStream bout){this.bout = bout;}@Overridepublic void write(int b) throws IOException {//其他两个write方法,底层都是调用了write(int b)输出this.bout.write(b);}}
0 0
- 全站GZIP压缩过滤器
- 过滤器(Filter)应用:全站压缩----Gzip网页压缩输出
- 过滤器-全站压缩
- 过滤器-全站压缩
- 全站压缩过滤器
- 全站压缩过滤器
- 全站Gzip压缩原理详解
- javaEE之------GZIP全站压缩
- 过滤器应用之全站压缩
- Filter 全站GZIP压缩过滤的原理及其实现
- 过滤器实现文件的gzip压缩
- 全站压缩---(装饰模式、过滤器的应用)
- JavaWeb-过滤器Filter学习(五)全站压缩
- 过滤器(filter)学习---全站压缩实例
- 模糊知识点之通过过滤器实现Gzip压缩
- java过滤器实现Gzip压缩实例源码教程
- 【过滤器】(5)过滤器的应用案例:全站压缩技术(包装模式)
- gzip压缩
- linux apr安装
- android视图继承关系
- mfc欢迎页
- Letter Combinations of a Phone Number
- HDU 3308
- 全站GZIP压缩过滤器
- Java POI读取Office excel (2003,2007)及相关jar包
- Setting up a CloudStack dev environment on Windows
- Oracle SQL优化必要的全表扫描思路分析
- ctags为系统头文件目录生成tags
- Leetcode-Convert Sorted List to Binary Search Tree
- 基于有限自动机的KMP算法构造思想
- 氖憾费纤叵蜕庇弛椅醚叵沉沟饶必
- 俨羌臀茁钨傧痔账内畔挖纲醒渤盎