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.
Wenn Sie Ihren Code ohne den Komprimierungsteil ausführen, wird die Antwort erfolgreich übergeben? –
Ja, alles funktioniert mit JSON funktioniert gut ohne die Komprimierung –
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