GzipFilter过滤器提升网站性能.docx

上传人:汽*** 文档编号:509597573 上传时间:2023-06-09 格式:DOCX 页数:4 大小:13.08KB
返回 下载 相关 举报
GzipFilter过滤器提升网站性能.docx_第1页
第1页 / 共4页
GzipFilter过滤器提升网站性能.docx_第2页
第2页 / 共4页
GzipFilter过滤器提升网站性能.docx_第3页
第3页 / 共4页
GzipFilter过滤器提升网站性能.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《GzipFilter过滤器提升网站性能.docx》由会员分享,可在线阅读,更多相关《GzipFilter过滤器提升网站性能.docx(4页珍藏版)》请在金锄头文库上搜索。

1、package cn.test.web.filter;import java.io.ByteArrayOutputStream;import java.io.lOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.Printwriter;import java.util.zip.GZIPOutputStream;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.

2、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.HttpServletRespons

3、eWrapper;/*实现压缩数据,再响应给浏览器;以提高网站性能;*/public class GzipFilter implements Filter (Overridepublic void init(FilterConfig filterConfig) throws ServletException )(Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws lOException, ServletException (HttpServletReque

4、st request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;/ response.getOutputStream().write()是把数据写入到浏览器;/为了把数据拦截下来,实现压缩,需要重新复写response.getOutputStreamOR 表的类 ServletOutputStream 及 response.getOutputStream().write 表法/实现把数据写入到内存中去洞样,我们还需要复写response.getWriter代表的类Pr

5、intwriter 及 write 方法BufferResponse buffResponse = new BufferResponse(response);chain.doFilter(request, buffResponse);/然后把内存中的数据压缩后响应给浏览器byte buff = buffResponse.getBuffer();System.out.println(原始大小+ buff.length);/把数据压缩后写入boutByteArrayOutputStream bout = new ByteArrayOutputStreamf);GZIPOutputStream go

6、ut = new GZIPOutputStream(bout); gout.write(buff);gout.close();/关闭,刷新流byte gzip = bout.toByteArrayO;(压缩后的大小+ gzip.length);/设置压缩头及压缩长度response.setHeader(content-encoding, gzip);response.setContentLength(gzip.length);/拦截数据压缩后,真正的回写给浏览器response.getOutputStream().write(gzip);)(Overridepublic void destro

7、y() ()*我们要包装response对象,重写getOutputStream及getWriter方法*/class BufferResponse extends HttpServletResponseWrapper (private HttpServletResponse response;/把数据写入到内存中;然后提供方法,暴露给调用者无论是字符字节,getOutputStream还是getWriter的write;都写入到该内存流中private ByteArrayOutputStream bout = new ByteArrayOutputStream();private Print

8、writer pw;public BufferResponse(HttpServletResponse response) (super(response);this.response = response;)/* 重写 getOutputStreamf)方法,返 Pl 的对象是 super.getOutputStream() (ServletOutputStream 类)*我们不能直接返回该对象,否则ServletOutputStream.write方法直接把数据回写给 浏览器了*那么,查看ServletOutputStream类,可以看到是一个抽象类,没有直接操作底层流 的方法*此时,我们

9、需要自定义一个类(MyServletOutputStream*),继承自ServletOutputStream;内部去维护一个底层流,把数据写入到该流;*/(Overridepublic ServletOutputStream getOutputStream() throws lOException (/ return super.getOutputStream();/我们不能直接返回 super.getOutputStream(),否则直接 响应给浏览器了return new MyServletOutputStream(bout);)/*同理;在复写Printwriter类的时候,我们也需要

10、重写write方法,把数据通过流存入 到内存中;通过查看Printwriter类,其构造方法有实现底层流的方法;我们只需要new 一个该类*/(Overridepublic Printwriter getWriter() throws lOException (把字符流转成字节流:写入到bout中注意;要把缓冲的数据刷入到内存中pw=newPrintWriter(newOutputStreamWriterfbout,this.response.getCharacterEncoding();return pw;)/提供方法把内存中的数据返回给调用者public byte getBuffer()

11、(try(if(pw!=null)(pw.close();/字符流;需要刷新缓冲,把数据刷到内存中)if (bout != null) (bout.flush();return bout.toByteArray();)return null; catch (Exception e) throw new RuntimeException(e);)*定义-个自己的类,继承ServletOutputStream;重写write方法,把拦截的数据写到内 存中;*/class MyServletOutputStream extends ServletOutputStream private ByteAr

12、rayOutputStream bout;public MyServletOutputStream(ByteArrayOutputStream bout) (this.bout = bout;)/write(byte)其实也是通过write(int)方法;只需要实现write(int)Overridepublic void write(int b) throws lOException (bout.write(b);)/*我们虽然实现了压缩数据响应到客户端;但是还是有些问题的;1. 压缩数据不要对所有类型的都压缩后打给浏览器;若资源是一个下载文件(电影之类 的);那么把数据压缩到ByteArr

13、ayOutputStream中,内存肯定挂掉;通常我们只需要把字符流中 的数据压缩后打给浏览器:比如jsp, css, js, html;那么在web.xml中就要针对这些资源进行过 滤压缩;对于其他类型的数据,比如图片,下载文件等字节流不要过滤了;其实对字节流压缩效果 本身就不大;2. 在指定压缩类型jsp后,乂出现一个新问题;对于servlet处理程序,需要forward到jsp 页面时,此时会跳过压缩过滤器;需要在web.xml配置dispatcher的类型(指定对FORWARD. REQUEST有效;); dispatcher 共四种方式:REQUEST、FORWARD INCLUDE、ERRORGzipFiltercn.test.web.filter.GzipFilterGzipFilter*.jspFORWARDREQUESTGzipFilter*.jsGzipFilter*.cssGzipFilter*.html*/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号