Note that there are some explanatory texts on larger screens.

plurals
  1. POUse GZIP, JSON responses and JQuery
    text
    copied!<p>However, I want to compress my responses with GZIP wheren possible. I tried using the <a href="http://www.headfirstlabs.com/books/hfsvlt/" rel="noreferrer">Compression filter code</a> available for free download in the headfirst site. It works great for html, images, css and javascript. </p> <p>I post the filter next. It checks if GZIP is an accepted encoding and it adds gzip as Content-Encoding. See: <code>wrappedResp.setHeader("Content-Encoding", "gzip");</code></p> <pre><code>public class CompressionFilter implements Filter { private ServletContext ctx; private FilterConfig cfg; /** * The init method saves the config object and a quick reference to the * servlet context object (for logging purposes). */ public void init(FilterConfig cfg) throws ServletException { this.cfg = cfg; ctx = cfg.getServletContext(); //ctx.log(cfg.getFilterName() + " initialized."); } /** * The heart of this filter wraps the response object with a Decorator * that wraps the output stream with a compression I/O stream. * Compression of the output stream is only performed if and only if * the client includes an Accept-Encoding header (specifically, for gzip). */ public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; // Dose the client accept GZIP compression? String valid_encodings = request.getHeader("Accept-Encoding"); if ( (valid_encodings != null) &amp;&amp; (valid_encodings.indexOf("gzip") &gt; -1) ) { // Then wrap the response object with a compression wrapper // We'll look at this class in a minute. CompressionResponseWrapper wrappedResp = new CompressionResponseWrapper(response); // Declare that the response content is being GZIP encoded. wrappedResp.setHeader("Content-Encoding", "gzip"); // Chain to the next component (thus processing the request) fc.doFilter(request, wrappedResp); // A GZIP compression stream must be "finished" which also // flushes the GZIP stream buffer which sends all of its // data to the original response stream. GZIPOutputStream gzos = wrappedResp.getGZIPOutputStream(); gzos.finish(); // The container handles the rest of the work. //ctx.log(cfg.getFilterName() + ": finished the request."); } else { fc.doFilter(request, response); //ctx.log(cfg.getFilterName() + ": no encoding performed."); } } public void destroy() { // nulling out my instance variables cfg = null; ctx = null; } } </code></pre> <p>I was using the next code to send JSON responses in Struts web application. </p> <pre><code>public ActionForward get(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { JSONObject json = // Do some logic here RequestUtils.populateWithJSON(response, json); return null; } public static void populateWithJSON(HttpServletResponse response,JSONObject json) { if(json!=null) { response.setContentType("text/x-json;charset=UTF-8"); response.setHeader("Cache-Control", "no-cache"); try { response.getWriter().write(json.toString()); } catch (IOException e) { throw new ApplicationException("IOException in populateWithJSON", e); } } } </code></pre> <p>It works fine without compression but if I compress JSON responses, I can not see my JSON objects anymore. I handle JSON Ajax calls with JQuery with code snippets as follows: </p> <pre><code> $.post(url,parameters, function(json) { // Do some DOM manipulation with the data contained in the JSON Object }, "json"); </code></pre> <p>If I see the response with Firebug it is empty. </p> <p>Should I refractor my compression filter to skip compression in JSON responses? or there is a workaround to this?</p> <p>For me, it looks like JQuery does not recognize the response as JSON because I am adding the Gzip compression. </p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload