2009-04-01 6 views
10

Allerdings möchte ich meine Antworten mit GZIP wo möglich komprimieren. Ich habe versucht, die Compression filter code zum kostenlosen Download in der Headfirst-Website verfügbar. Es funktioniert hervorragend für HTML, Bilder, CSS und Javascript.Verwenden Sie GZIP, JSON-Antworten und JQuery

Ich poste den Filter als nächstes. Es prüft, ob GZIP eine akzeptierte Codierung ist und fügt gzip als Content-Encoding hinzu. Siehe: 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; 
     } 
    } 

ich den nächsten Code mit JSON Antworten in Struts-Web-Anwendung zu senden.

Es funktioniert gut ohne Komprimierung, aber wenn ich JSON Antworten komprimiere, kann ich meine JSON Objekte nicht mehr sehen. Ich behandle JSON Ajax-Aufrufe mit JQuery mit Code-Schnipsel wie folgt:

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

Wenn ich die Antwort mit Firebug sehen es leer ist.

Sollte ich meinen Komprimierungsfilter refrazieren, um die Komprimierung in JSON-Antworten zu überspringen? oder gibt es einen Workaround?

Für mich sieht es so aus, als ob JQuery die Antwort nicht als JSON erkennt, weil ich die Gzip-Komprimierung hinzufüge.

+0

Wenn Sie Ihren Code ohne den Komprimierungsteil ausführen, wird die Antwort erfolgreich übergeben? –

+0

Ja, alles funktioniert mit JSON funktioniert gut ohne die Komprimierung –

+0

Haben Sie eine Lösung dafür? Ich habe ein ähnliches ungelöstes Problem. Es wäre toll, wenn Sie Ihre Antwort posten könnten. – Lijo

Antwort

3

Sie müssen einen weiteren Header "content-encoding: gzip" hinzufügen, wenn Sie es komprimieren.

+0

habe ich schon gemacht. Ich bearbeite meinen Beitrag. Danke für die Antwort trotzdem. –

0

Haben Sie versucht mit einem expliziten Java-basierten Client, um sicherzustellen, dass es ein Problem mit jQuery oder Browser ist? Wenn der Java-Client fehlschlägt, stimmt etwas mit der Serverantwort nicht.

Aber ich nehme an, dass, während Browser Unkomprimierung mit direkten Anforderungen umgehen kann, dies möglicherweise nicht auf Ajax-Anrufe angewendet wird.

Es ist eine interessante Frage, ich hoffe, wir werden eine endgültige Antwort bekommen. :)

5

Wenn ich die Antwort mit Firebug sehe, ist es leer.

Es ist Ihr Anhaltspunkt - es ist kein JQuery-Problem, es ist Server-Seite. (Ich fürchte, ich kann Ihnen dabei nicht weiterhelfen, als dass Sie vorschlagen, auf die Client-Seite zu schauen)

Es gibt kein Problem, Gjipping Ajax Antworten - wenn Sie die Antwort in Firebug dann nicht sehen können JQuery kann es auch nicht sehen.

+0

Kann es nach dem Server und vor dem Client sein? Ein Problem mit einigen Netzwerkelementen? – Lijo

Verwandte Themen