View Javadoc

1   package com.panogenesis.webapp.filter;
2   
3   import java.io.IOException;
4   
5   import javax.servlet.Filter;
6   import javax.servlet.FilterChain;
7   import javax.servlet.FilterConfig;
8   import javax.servlet.ServletException;
9   import javax.servlet.ServletRequest;
10  import javax.servlet.ServletResponse;
11  import javax.servlet.http.HttpServletRequest;
12  import javax.servlet.http.HttpServletResponse;
13  
14  import org.apache.commons.logging.Log;
15  import org.apache.commons.logging.LogFactory;
16  
17  import org.displaytag.tags.TableTagParameters;
18  
19  /***
20   * Filter that compresses output with gzip (assuming that browser supports gzip).
21   * Code from <a href="http://www.onjava.com/pub/a/onjava/2003/11/19/filters.html">
22   * http://www.onjava.com/pub/a/onjava/2003/11/19/filters.html</a>.
23   *
24   * &copy; 2003 Jayson Falkner You may freely use the code both commercially
25   * and non-commercially.
26   *
27   * @author  Matt Raible
28   *
29   * @web.filter
30   *     display-name="Compression Filter"
31   *     name="compressionFilter"
32   */
33  public class GZIPFilter implements Filter {
34      private final transient Log log = LogFactory.getLog(GZIPFilter.class);
35  
36      public void doFilter(ServletRequest req, ServletResponse res,
37                           FilterChain chain)
38      throws IOException, ServletException {
39          if (req instanceof HttpServletRequest) {
40              HttpServletRequest request = (HttpServletRequest) req;
41              HttpServletResponse response = (HttpServletResponse) res;
42  
43              if (isGZIPSupported(request)) {
44                  if (log.isDebugEnabled()) {
45                      log.debug("GZIP supported, compressing response");
46                  }
47  
48                  GZIPResponseWrapper wrappedResponse =
49                      new GZIPResponseWrapper(response);
50  
51                  chain.doFilter(req, wrappedResponse);
52                  wrappedResponse.finishResponse();
53  
54                  return;
55              }
56  
57              chain.doFilter(req, res);
58          }
59      }
60  
61      /***
62       * Convenience method to test for GZIP cababilities
63       * @param req The current user request
64       * @return boolean indicating GZIP support
65       */
66      private boolean isGZIPSupported(HttpServletRequest req) {
67          
68          // disable gzip filter for exporting from displaytag
69          String exporting =
70              req.getParameter(TableTagParameters.PARAMETER_EXPORTING);
71          
72          if (exporting != null) {
73              if (log.isDebugEnabled()) {
74                  log.debug("detected excel export, disabling filter...");
75              }
76              return false;
77          }
78  
79          String browserEncodings = req.getHeader("accept-encoding");
80          boolean supported =
81              ((browserEncodings != null) &&
82              (browserEncodings.indexOf("gzip") != -1));
83  
84          String userAgent = req.getHeader("user-agent");
85  
86          if ((userAgent != null) && userAgent.startsWith("httpunit")) {
87              if (log.isDebugEnabled()) {
88                  log.debug("httpunit detected, disabling filter...");
89              }
90  
91              return false;
92          } else {
93              return supported;
94          }
95      }
96  
97      public void init(FilterConfig filterConfig) {
98      }
99  
100     public void destroy() {
101     }
102 }