zoukankan      html  css  js  c++  java
  • 利用Filter实现数据的压缩回写

    具体的Filter实现

    public class GzipFilter implements Filter {
    
        public void doFilter(ServletRequest req, ServletResponse resp,
                FilterChain chain) throws IOException, ServletException {
            
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) resp;
            MyResponse myresponse = new MyResponse(response);
            
            
            chain.doFilter(request, myresponse);  //response.getwriter  response.getOutputStream  
            
            //取出缓冲的数据压缩后输出
            byte out[] = myresponse.getBuffer();  //得到目标资源的输出
            System.out.println("压之前:" + out.length);
            
            
            byte gzipout[] = gzip(out);
            System.out.println("压之后:" + gzipout.length);
    
            
            response.setHeader("content-encoding", "gzip");
            response.setHeader("content-length", gzipout.length + "");
            response.getOutputStream().write(gzipout);
        }
        
        public byte[] gzip(byte b[]) throws IOException{
            
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            GZIPOutputStream gout = new GZIPOutputStream(bout);
            gout.write(b);
            gout.close();
            return bout.toByteArray();
        }
        
        class MyResponse extends HttpServletResponseWrapper{
            private ByteArrayOutputStream bout = new ByteArrayOutputStream();
            private PrintWriter pw;
            
            private HttpServletResponse response;
            public MyResponse(HttpServletResponse response) {
                super(response);
                this.response = response;
            }
            @Override
            public ServletOutputStream getOutputStream() throws IOException {
                return new MyServletOutputStream(bout);    //myresponse.getOutputStream().write("hahah");
            }
            
            @Override
            public PrintWriter getWriter() throws IOException {
                pw = new PrintWriter(new OutputStreamWriter(bout,response.getCharacterEncoding()));
                return pw;  //MyResponse.getWriter().write("中国");
            }
            public byte[] getBuffer(){
                if(pw!=null){
                    pw.close();
                }
                return bout.toByteArray();
            }
        }
        
        class MyServletOutputStream extends ServletOutputStream{
    
            private ByteArrayOutputStream bout;
            public MyServletOutputStream(ByteArrayOutputStream bout){
                this.bout = bout;
            }
            @Override
            public void write(int b) throws IOException {
                bout.write(b);
            }
            
        }
    
        public void destroy() {
            // TODO Auto-generated method stub
    
        }
    
        
        public void init(FilterConfig filterConfig) throws ServletException {
            // TODO Auto-generated method stub
    
        }
    
    }
  • 相关阅读:
    TCP/IP协议栈与数据包封装+TCP与UDP区别
    MySQL数据库优化总结
    MySQL存储引擎,锁,优化简述
    java实现常见查找算法
    Java的几种常见排序算法
    UML类图学习
    高性能的RTC服务器OpenFire
    常用的设计模式
    Swing JInternalFrame的使用
    Qt 模态与非模态
  • 原文地址:https://www.cnblogs.com/zhangbaowei/p/4730922.html
Copyright © 2011-2022 走看看