CompressionFilter.java
上传用户:bj_pst
上传日期:2019-07-07
资源大小:7353k
文件大小:7k
源码类别:

Java编程

开发平台:

Java

  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements.  See the NOTICE file distributed with
  4. * this work for additional information regarding copyright ownership.
  5. * The ASF licenses this file to You under the Apache License, Version 2.0
  6. * (the "License"); you may not use this file except in compliance with
  7. * the License.  You may obtain a copy of the License at
  8. *
  9. *     http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package compressionFilters;
  18. import java.io.IOException;
  19. import java.util.Enumeration;
  20. import javax.servlet.Filter;
  21. import javax.servlet.FilterChain;
  22. import javax.servlet.FilterConfig;
  23. import javax.servlet.ServletException;
  24. import javax.servlet.ServletRequest;
  25. import javax.servlet.ServletResponse;
  26. import javax.servlet.http.HttpServletRequest;
  27. import javax.servlet.http.HttpServletResponse;
  28. /**
  29.  * Implementation of <code>javax.servlet.Filter</code> used to compress
  30.  * the ServletResponse if it is bigger than a threshold.
  31.  *
  32.  * @author Amy Roh
  33.  * @author Dmitri Valdin
  34.  * @version $Revision: 466607 $, $Date: 2006-10-21 17:09:50 -0600 (Sat, 21 Oct 2006) $
  35.  */
  36. public class CompressionFilter implements Filter{
  37.     /**
  38.      * The filter configuration object we are associated with.  If this value
  39.      * is null, this filter instance is not currently configured.
  40.      */
  41.     private FilterConfig config = null;
  42.     /**
  43.      * Minimal reasonable threshold
  44.      */
  45.     private int minThreshold = 128;
  46.     /**
  47.      * The threshold number to compress
  48.      */
  49.     protected int compressionThreshold;
  50.     /**
  51.      * Debug level for this filter
  52.      */
  53.     private int debug = 0;
  54.     /**
  55.      * Place this filter into service.
  56.      *
  57.      * @param filterConfig The filter configuration object
  58.      */
  59.     public void init(FilterConfig filterConfig) {
  60.         config = filterConfig;
  61.         if (filterConfig != null) {
  62.             String value = filterConfig.getInitParameter("debug");
  63.             if (value!=null) {
  64.                 debug = Integer.parseInt(value);
  65.             } else {
  66.                 debug = 0;
  67.             }
  68.             String str = filterConfig.getInitParameter("compressionThreshold");
  69.             if (str!=null) {
  70.                 compressionThreshold = Integer.parseInt(str);
  71.                 if (compressionThreshold != 0 && compressionThreshold < minThreshold) {
  72.                     if (debug > 0) {
  73.                         System.out.println("compressionThreshold should be either 0 - no compression or >= " + minThreshold);
  74.                         System.out.println("compressionThreshold set to " + minThreshold);
  75.                     }
  76.                     compressionThreshold = minThreshold;
  77.                 }
  78.             } else {
  79.                 compressionThreshold = 0;
  80.             }
  81.         } else {
  82.             compressionThreshold = 0;
  83.         }
  84.     }
  85.     /**
  86.     * Take this filter out of service.
  87.     */
  88.     public void destroy() {
  89.         this.config = null;
  90.     }
  91.     /**
  92.      * The <code>doFilter</code> method of the Filter is called by the container
  93.      * each time a request/response pair is passed through the chain due
  94.      * to a client request for a resource at the end of the chain.
  95.      * The FilterChain passed into this method allows the Filter to pass on the
  96.      * request and response to the next entity in the chain.<p>
  97.      * This method first examines the request to check whether the client support
  98.      * compression. <br>
  99.      * It simply just pass the request and response if there is no support for
  100.      * compression.<br>
  101.      * If the compression support is available, it creates a
  102.      * CompressionServletResponseWrapper object which compresses the content and
  103.      * modifies the header if the content length is big enough.
  104.      * It then invokes the next entity in the chain using the FilterChain object
  105.      * (<code>chain.doFilter()</code>), <br>
  106.      **/
  107.     public void doFilter ( ServletRequest request, ServletResponse response,
  108.                         FilterChain chain ) throws IOException, ServletException {
  109.         if (debug > 0) {
  110.             System.out.println("@doFilter");
  111.         }
  112.         if (compressionThreshold == 0) {
  113.             if (debug > 0) {
  114.                 System.out.println("doFilter gets called, but compressionTreshold is set to 0 - no compression");
  115.             }
  116.             chain.doFilter(request, response);
  117.             return;
  118.         }
  119.         boolean supportCompression = false;
  120.         if (request instanceof HttpServletRequest) {
  121.             if (debug > 1) {
  122.                 System.out.println("requestURI = " + ((HttpServletRequest)request).getRequestURI());
  123.             }
  124.             // Are we allowed to compress ?
  125.             String s = (String) ((HttpServletRequest)request).getParameter("gzip");
  126.             if ("false".equals(s)) {
  127.                 if (debug > 0) {
  128.                     System.out.println("got parameter gzip=false --> don't compress, just chain filter");
  129.                 }
  130.                 chain.doFilter(request, response);
  131.                 return;
  132.             }
  133.             Enumeration e =
  134.                 ((HttpServletRequest)request).getHeaders("Accept-Encoding");
  135.             while (e.hasMoreElements()) {
  136.                 String name = (String)e.nextElement();
  137.                 if (name.indexOf("gzip") != -1) {
  138.                     if (debug > 0) {
  139.                         System.out.println("supports compression");
  140.                     }
  141.                     supportCompression = true;
  142.                 } else {
  143.                     if (debug > 0) {
  144.                         System.out.println("no support for compresion");
  145.                     }
  146.                 }
  147.             }
  148.         }
  149.         if (!supportCompression) {
  150.             if (debug > 0) {
  151.                 System.out.println("doFilter gets called wo compression");
  152.             }
  153.             chain.doFilter(request, response);
  154.             return;
  155.         } else {
  156.             if (response instanceof HttpServletResponse) {
  157.                 CompressionServletResponseWrapper wrappedResponse =
  158.                     new CompressionServletResponseWrapper((HttpServletResponse)response);
  159.                 wrappedResponse.setDebugLevel(debug);
  160.                 wrappedResponse.setCompressionThreshold(compressionThreshold);
  161.                 if (debug > 0) {
  162.                     System.out.println("doFilter gets called with compression");
  163.                 }
  164.                 try {
  165.                     chain.doFilter(request, wrappedResponse);
  166.                 } finally {
  167.                     wrappedResponse.finishResponse();
  168.                 }
  169.                 return;
  170.             }
  171.         }
  172.     }
  173.     /**
  174.      * Set filter config
  175.      * This function is equivalent to init. Required by Weblogic 6.1
  176.      *
  177.      * @param filterConfig The filter configuration object
  178.      */
  179.     public void setFilterConfig(FilterConfig filterConfig) {
  180.         init(filterConfig);
  181.     }
  182.     /**
  183.      * Return filter config
  184.      * Required by Weblogic 6.1
  185.      */
  186.     public FilterConfig getFilterConfig() {
  187.         return config;
  188.     }
  189. }