package cn.hongxin.filter;public class GzipFilter2 implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse resp= (HttpServletResponse) response; //聲明包裝類對象 MyResponse2 myresp = new MyResponse2(resp); //放行,調用oneServlet.doGet chain.doFilter(request, myresp); //第二步:從myresp2中讀取原生的數據 byte[] src = myresp.getSrc(); //第三步:開始壓縮 ByteArrayOutputStream destBytes = new ByteArrayOutputStream(); GZIPOutputStream zip = new GZIPOutputStream(destBytes); zip.write(src); zip.close(); //第三步:輸出-使用原生的response resp.setContentType("text/html;charset=UTF-8"); //獲壓縮以后數據 byte[] dest = destBytes.toByteArray(); System.err.//第一步:聲明response的包裝類class MyResponse2 extends HttpServletResponseWrapper{ //將這個容器/a.txt,聲明成員變量 private ByteArrayOutputStream srcByte; public MyResponse2(HttpServletResponse response) { super(response); } //修改增強getWtier方法 @Override public PrintWriter getWriter() throws IOException { srcByte = new ByteArrayOutputStream(); PrintWriter out = new PrintWriter( new OutputStreamWriter(srcByte, "UTF-8")); return out; } //提供一個方法獲取原生 的數據 public byte[] getSrc(){ return srcByte.toByteArray(); }}第五步:全部的jsp都要經過壓縮只要是通過包裝rersponse,且修改了getWriter方法,返回一個自己的printwiter對象。聲明一個放原數據的容器對象。就可以實現數據壓縮。
public class GzipFilter2 implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse resp= (HttpServletResponse) response; //聲明包裝類對象 MyResponse2 myresp = new MyResponse2(resp); //放行,調用oneServlet.doGet chain.doFilter(request, myresp); //第二步:從myresp2中讀取原生的數據 byte[] src = myresp.getSrc(); //第三步:開始壓縮 ByteArrayOutputStream destBytes = new ByteArrayOutputStream(); GZIPOutputStream zip = new GZIPOutputStream(destBytes); zip.write(src); zip.close(); //第三步:輸出-使用原生的response resp.setContentType("text/html;charset=UTF-8"); //獲壓縮以后數據 byte[] dest = destBytes.toByteArray(); System.err.println("壓縮之前:"+src.length); System.err.println("壓縮以后:"+dest.length); //設置頭 resp.setContentLength(dest.length); resp.setHeader("Content-Encoding","gzip"); //輸出 OutputStream out = resp.getOutputStream(); out.write(dest); } public void destroy() { }}//第一步:聲明response的包裝類class MyResponse2 extends HttpServletResponseWrapper{ //將這個容器/a.txt,聲明成員變量 private ByteArrayOutputStream srcByte; private PrintWriter out; public MyResponse2(HttpServletResponse response) { super(response); } //修改增強getWtier方法 @Override public PrintWriter getWriter() throws IOException { srcByte = new ByteArrayOutputStream(); out = new PrintWriter( new OutputStreamWriter(srcByte, "UTF-8")); return out; } //提供一個方法獲取原生 的數據 public byte[] getSrc(){ if(out!=null){ out.close(); } return srcByte.toByteArray(); }}且它的配置如下:
<filter>
<filter-name>zip2</filter-name>
<filter-class>cn.itcast.filter.GzipFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>zip2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
同時實現對getoutputstream和getWtier壓縮在myrespons2這個類中,對getoutputstream也要覆蓋。
返回一個ServletOutputSteam的匿名對象。
實現witer(int b)方法,將數據寫到bytearrayoyutpoutstream.
public ServletOutputStream getOutputStream() throws IOException {
srcByte = new ByteArrayOutputStream();
ServletOutputStream out = new ServletOutputStream() {
//所有IO最終都是一個個字節寫出信息
@Override
public void write(int b) throws IOException {
System.err.println(">>>:"+b);
srcByte.write(b);//寫到自己的緩存中去-相當于StringBuffer.append(""+b);
}
};
return out;
}
新聞熱點
疑難解答