zoukankan      html  css  js  c++  java
  • 过滤器压缩全站jsp

    过滤器:

     1 public class Gzip implements Filter {
     2 
     3     public void destroy() {}
     4 
     5     public void doFilter(ServletRequest request, ServletResponse response,
     6             FilterChain chain) throws IOException, ServletException {
     7         HttpServletResponse resp=(HttpServletResponse) response;
     8         MyResp myResp=new MyResp(resp);//包装过的response
     9         chain.doFilter(request, myResp);//放行
    10         
    11         byte[] srcBytes= myResp.getSrcByte();//获取源数据
    12         ByteArrayOutputStream bOutStream=new ByteArrayOutputStream();//目标容器
    13         GZIPOutputStream zipOutStream=new GZIPOutputStream(bOutStream);//压缩工具
    14         zipOutStream.write(srcBytes);//写到容器中
    15         zipOutStream.close();//如果不关闭,会在缓存中,不写出
    16         
    17         byte[] descByte=bOutStream.toByteArray();
    18         
    19         System.out.println("-------------------");
    20         System.out.println("压缩前:"+srcBytes.length);
    21         System.out.println("压缩后:"+ descByte.length);
    22         System.out.println("-------------------");
    23         
    24         //使用原生response输出
    25         resp.setContentType("text/html;charset=utf-8");
    26         resp.setHeader("Content-Encoding", "Gzip");
    27         resp.setContentLength(srcBytes.length);
    28         
    29         //输出
    30         OutputStream out=resp.getOutputStream();
    31         out.write(descByte);//关闭
    32         
    33         
    34     }
    35     public void init(FilterConfig filterConfig) throws ServletException {}
    36 
    37 }
    38 
    39 class MyResp extends HttpServletResponseWrapper
    40 {
    41     private  PrintWriter outWrite;
    42     private ByteArrayOutputStream srcByte;
    43     //获取原生数据
    44     public byte[] getSrcByte() {
    45         if(outWrite!=null)//如果不关闭流,不会显示,因为数据在缓存中,没有写出
    46         {
    47             outWrite.close();
    48         }
    49         return srcByte.toByteArray();
    50     }
    51 
    52     public MyResp(HttpServletResponse response) {
    53         super(response);
    54 
    55     }
    56 
    57     //包装getWrite()方法,jsp页面输出内容使用的是response.getWriter().write("")
    58     //所以要包装
    59     @Override
    60     public PrintWriter getWriter() throws IOException {
    61         srcByte=new ByteArrayOutputStream();//输出的源数据
    62         outWrite=new PrintWriter(new OutputStreamWriter(srcByte,"utf-8"));        
    63         return outWrite;
    64     }
    65     
    66 }

    如果过滤器需要过滤Servlet,则需要用response.getWriter().write("")输出,否则不会被过滤

    1 response.setContentType("text/html;charset=utf-8");    
    2         String str="你好,同学;Hello World";
    3         PrintWriter writer=response.getWriter();
    4         writer.write(str);
    5         writer.close();

    如果Servlet中使用response.getOutputStream().write("")输出,则需要包装getOutputStream()方法

    1 response.setContentType("text/html;charset=utf-8");    
    2         String str="你好,同学;Hello World";
    3         String times=request.getParameter("times");
    4         int n=Integer.valueOf(times);
    5         OutputStream out=response.getOutputStream();
    6         for (int i = 0; i < n; i++) {
    7             out.write(str.getBytes("utf-8"));
    8         }
    9         out.close();

    包装getOutputStream()方法

     1     @Override
     2     public ServletOutputStream getOutputStream() throws IOException {
     3         srcByte =new ByteArrayOutputStream();//输出的源数据
     4         ServletOutputStream out=new ServletOutputStream() {            
     5             @Override
     6             public void write(int b) throws IOException {
     7                 srcByte.write(b);                
     8             }
     9         };
    10         return out;
    11     }
  • 相关阅读:
    BZOJ4896 THUSC2016补退选(trie)
    BZOJ4892 Tjoi2017dna(后缀数组)
    BZOJ4890 Tjoi2017城市
    BZOJ4888 Tjoi2017异或和(树状数组)
    BZOJ4887 Tjoi2017可乐(动态规划+矩阵快速幂)
    BZOJ4883 棋盘上的守卫(环套树+最小生成树)
    BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)
    BZOJ4878 挑战NP-Hard(dfs树)
    BZOJ5466 NOIP2018保卫王国(倍增+树形dp)
    BZOJ4873 Shoi2017寿司餐厅(最小割)
  • 原文地址:https://www.cnblogs.com/liuwt365/p/4127153.html
Copyright © 2011-2022 走看看