KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > appfuse > webapp > filter > GZIPFilter


1 package org.appfuse.webapp.filter;
2
3 import java.io.IOException JavaDoc;
4
5 import javax.servlet.FilterChain JavaDoc;
6 import javax.servlet.ServletException JavaDoc;
7 import javax.servlet.http.HttpServletRequest JavaDoc;
8 import javax.servlet.http.HttpServletResponse JavaDoc;
9
10 import org.apache.commons.logging.Log;
11 import org.apache.commons.logging.LogFactory;
12 import org.displaytag.tags.TableTagParameters;
13 import org.springframework.web.filter.OncePerRequestFilter;
14
15 /**
16  * Filter that compresses output with gzip (assuming that browser supports gzip).
17  * Code from <a HREF="http://www.onjava.com/pub/a/onjava/2003/11/19/filters.html">
18  * http://www.onjava.com/pub/a/onjava/2003/11/19/filters.html</a>.
19  *
20  * &copy; 2003 Jayson Falkner You may freely use the code both commercially
21  * and non-commercially.
22  *
23  * @author Matt Raible
24  *
25  * @web.filter name="compressionFilter"
26  */

27 public class GZIPFilter extends OncePerRequestFilter {
28     private final transient Log log = LogFactory.getLog(GZIPFilter.class);
29
30     public void doFilterInternal(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response,
31                                  FilterChain JavaDoc chain)
32     throws IOException JavaDoc, ServletException JavaDoc {
33
34         if (isGZIPSupported(request)) {
35             if (log.isDebugEnabled()) {
36                 log.debug("GZIP supported, compressing response");
37             }
38
39             GZIPResponseWrapper wrappedResponse =
40                 new GZIPResponseWrapper(response);
41
42             chain.doFilter(request, wrappedResponse);
43             wrappedResponse.finishResponse();
44
45             return;
46         }
47
48         chain.doFilter(request, response);
49     }
50
51     /**
52      * Convenience method to test for GZIP cababilities
53      * @param req The current user request
54      * @return boolean indicating GZIP support
55      */

56     private boolean isGZIPSupported(HttpServletRequest JavaDoc req) {
57         
58         // disable gzip filter for exporting from displaytag
59
String JavaDoc exporting = req.getParameter(TableTagParameters.PARAMETER_EXPORTING);
60         
61         if (exporting != null) {
62             log.debug("detected excel export, disabling filter...");
63             return false;
64         }
65
66         String JavaDoc browserEncodings = req.getHeader("accept-encoding");
67         boolean supported = ((browserEncodings != null) &&
68                              (browserEncodings.indexOf("gzip") != -1));
69
70         String JavaDoc userAgent = req.getHeader("user-agent");
71
72         if ((userAgent != null) && userAgent.startsWith("httpunit")) {
73             log.debug("httpunit detected, disabling filter...");
74
75             return false;
76         } else {
77             return supported;
78         }
79     }
80 }
81
Popular Tags