2009-04-01 13 views
10

Tuttavia, voglio comprimere le mie risposte con GZIP dove possibile. Ho provato a utilizzare il Compression filter code disponibile per il download gratuito nel sito di headfirst. Funziona benissimo per html, immagini, css e javascript.Utilizzare le risposte GZIP, JSON e JQuery

Inserisco il filtro successivo. Controlla se GZIP è una codifica accettata e aggiunge gzip come Content-Encoding. Vedere: wrappedResp.setHeader("Content-Encoding", "gzip");

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) && (valid_encodings.indexOf("gzip") > -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; 
     } 
    } 

stavo usando il codice successivo per inviare le risposte JSON in applicazione web Struts.

Funziona bene senza compressione ma se comprime le risposte JSON, non riesco più a vedere i miei oggetti JSON. Mi occupo JSON chiamate Ajax con jQuery con frammenti di codice come segue:

$.post(url,parameters, function(json) { 
    // Do some DOM manipulation with the data contained in the JSON Object 
}, "json"); 

Se vedo la risposta con Firebug è vuota.

Devo rifrattare il mio filtro di compressione per saltare la compressione nelle risposte JSON? o c'è una soluzione a questo?

Per me, sembra che JQuery non riconosca la risposta come JSON perché sto aggiungendo la compressione Gzip.

+0

Se si esegue il codice senza la parte di compressione, viene inviata correttamente la risposta? –

+0

Sì, tutto funziona con JSON funziona bene senza la compressione –

+0

Hai ottenuto una soluzione per questo? Ho un problema irrisolto simile. Sarebbe bello se tu potessi pubblicare la tua risposta. – Lijo

risposta

3

devi aggiungere ancora una intestazione "content-encoding: gzip" se la stai comprimendo.

+0

L'ho già fatto. Modifico il mio post. Grazie comunque per la risposta. –

0

Hai provato con un client java esplicito per assicurarti che si tratti di un problema con jQuery o browser? Se il client java fallisce, c'è qualcosa di sbagliato nella risposta del server.

Ma suppongo che mentre il browser è in grado di gestire la decompressione con richieste dirette, questo forse non è applicato alle chiamate Ajax.

È una domanda interessante, spero che otterremo una risposta più definitiva. :)

5

Se vedo la risposta con Firebug è vuoto.

C'è il tuo indizio - non è un problema di JQuery, è lato server. (Temo di non poterti aiutare, oltre a suggerirti di smettere di guardare al lato client)

Non c'è problema a gzipare le risposte ajax - se non riesci a vedere la risposta in Firebug, allora JQuery non può vederlo neanche.

+0

Può essere dopo il server e prima del client? Un problema creato da alcuni elementi di rete? – Lijo