vickzhu

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            151 隨筆 :: 0 文章 :: 34 評論 :: 0 Trackbacks


          將response內響應給使用者的內容,使用GZIP壓縮的方式回傳給瀏覽器,而IE5和NS6也都有支持Gzip的壓縮格式。
          這個方法在之前就有人提出過,因為是讓網頁在輸出時經過壓縮,可以讓傳輸量變小很多,雖然現在的網絡頻寬對于用來看網頁已經綽綽有余,但是檔案大小太大的網頁還是會造成一定的影響。
          經過Gzip壓縮過的網頁,檔案大小可以到原本壓縮前的20%。

          package com.jsptw.filter;
          import java.io.*;
          import java.util.zip.GZIPOutputStream;
          import javax.servlet.*;
          import javax.servlet.http.*;
          public class GZIPEncodeFilter implements Filter {
                public void init(FilterConfig filterConfig) {}
                public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain)
                                                throws IOException, ServletException {       
                  String transferEncoding = getGZIPEncoding((HttpServletRequest)request);       
                  if (transferEncoding == null) {           
                    chain.doFilter(request, response);       
                  } else{         
                    ((HttpServletResponse)response).setHeader("Content-Encoding", transferEncoding);
                      GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse((HttpServletResponse)response);
                      chain.doFilter(request, wrappedResponse);         
                      wrappedResponse.flush();       
                  }   
                }   
                public void destroy() {}   
                private static String getGZIPEncoding(HttpServletRequest request) {       
                  String acceptEncoding = request.getHeader("Accept-Encoding");       
                    if (acceptEncoding == null)
                      return null;       
                    acceptEncoding = acceptEncoding.toLowerCase();       
                    if (acceptEncoding.indexOf("x-gzip") >= 0) {
                      return "x-gzip";
                    }       
                    if (acceptEncoding.indexOf("gzip") >= 0) {           
                      return "gzip";       
                    }       
                    return null;   
                }   
               
                private class GZIPEncodableResponse extends HttpServletResponseWrapper {       
                  private GZIPServletStream wrappedOut;       
                    public GZIPEncodableResponse(HttpServletResponse response) throws IOException {          
                      super(response);           
                        wrappedOut = new GZIPServletStream(response.getOutputStream());       
                    }       
                    public ServletOutputStream getOutputStream() throws IOException {           
                      return wrappedOut;       
                    }       
                    private PrintWriter wrappedWriter;       
                    public PrintWriter getWriter() throws IOException {           
                      if (wrappedWriter == null) {               
                          wrappedWriter = new PrintWriter( new OutputStreamWriter( getOutputStream(), getCharacterEncoding()));            }           
                           return wrappedWriter;       
                        }       
                    public void flush() throws IOException {           
                      if (wrappedWriter != null) {              
                          wrappedWriter.flush();           
                        }          
                        wrappedOut.finish();       
                    }   
                }   
               
                private class GZIPServletStream extends ServletOutputStream {       
                  private GZIPOutputStream outputStream;       
                    public GZIPServletStream(OutputStream source) throws IOException {           
                   outputStream = new GZIPOutputStream(source);       
                 }       
                 public void finish() throws IOException {
                   OutputStream.finish();       
                 }       
                public void write(byte[] buf) throws IOException {           
                  outputStream.write(buf);       
                }       
                public void write(byte[] buf, int off, int len) throws IOException {           
                  outputStream.write(buf, off, len);       
                }       
                public void write(int c) throws IOException {           
                  outputStream.write(c);       
                }       
                public void flush() throws IOException {           
                  outputStream.flush();       
                }      
                public void close() throws IOException {           
                  outputStream.close();        
                }   
              }
          }


          web.xml中的設定為:
          <filter>       
          <filter-name>GZIPEncoder</filter-name>       
          <filter-class>com.jsptw.filter.GZIPEncodeFilter</filter-class>
          </filter>

          <filter-mapping> 
          <filter-name> GZIPEncoder</filter-name> 
          <url-pattern>/*</url-pattern>
          </filter-mapping> 

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/a_heng/archive/2009/09/22/4579979.aspx

          posted on 2009-11-30 16:26 筱 筱 閱讀(291) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 花垣县| 宽城| 卢氏县| 饶河县| 宁都县| 连云港市| 永顺县| 富宁县| 克山县| 汶上县| 琼海市| 泸溪县| 万载县| 阿荣旗| 界首市| 淮安市| 涿州市| 鄂温| 盐山县| 沙雅县| 临夏市| 通江县| 建阳市| 扬中市| 措美县| 青岛市| 察雅县| 鹰潭市| 昭觉县| 新闻| 安化县| 波密县| 桐庐县| 铅山县| 平昌县| 荔浦县| 正定县| 乳源| 富川| 民勤县| 澎湖县|