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.
Se si esegue il codice senza la parte di compressione, viene inviata correttamente la risposta? –
Sì, tutto funziona con JSON funziona bene senza la compressione –
Hai ottenuto una soluzione per questo? Ho un problema irrisolto simile. Sarebbe bello se tu potessi pubblicare la tua risposta. – Lijo