Gzip Content mit Java Servlets bereitstellen

7

Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, mit Java-Servlets gezippten Inhalt zu liefern. Ich habe bereits die App in Betrieb genommen, so dass die erforderlichen Änderungen zu schwer sein sollten.

Ich habe Zugriff auf das Antwortobjekt nur am Ende der doPost / doGet-Methode, also suche ich nach etwas wie

%Vor%

Es muss nicht so einfach sein, aber es wäre ideal.

Vielen Dank

    
Pablo Fernandez 07.12.2009, 21:10
quelle

7 Antworten

11

Dieser Artikel enthält den vollständigen (und kurzen) Quellcode für ein ServletFilter, der automatisch im laufenden Betrieb komprimiert wird.

    
Jonathan Feinberg 07.12.2009, 21:16
quelle
4

Je nach Ihrem Container wird der Container dies höchstwahrscheinlich für Sie tun. Es kann dies automatisch tun oder Sie müssen es manuell konfigurieren, um es für Sie zu tun. Der Vorteil dieser Methode ist, dass keine Codeänderungen vorgenommen werden. Außerdem können Sie je nach Container die Komprimierung abhängig von der Quelle der Anforderung oder vom Quellbrowser bedingt aktivieren / deaktivieren.

Sehen Sie sich für Tomcat das Komprimierungsattribut auf den HTTP-Konfigurationsseiten an ( v5.5 , v6.0 ).

    
Paul Wagland 07.12.2009 21:28
quelle
3

Sehen Sie sich die GzipOutputStream-Klasse an. Etwas wie das:

%Vor%

Dann benutze den Schreiber wie du es normalerweise tust.

    
maximdim 07.12.2009 21:17
quelle
2

Es gibt grundsätzlich zwei Möglichkeiten:

  • Konfigurieren Sie es auf dem Anwendungsserver. In Tomcat müssen Sie zum Beispiel das Attribut compression von Connector in conf/server.xml auf on .
  • setzen
  • Wickeln Sie die response.getOutputStream() in eine new GzipOutputStream() und schreiben Sie stattdessen an sie.

Der erste Weg betrifft die ganze Webapp, aber das sollte wirklich nicht schaden, es ist fast kein Aufwand und ein großer Gefallen für die Leistung. Und, noch wichtiger, im Gegensatz zu der zweiten Art prüft es tatsächlich die Anforderungsheader, wenn der Client Gzip vor der Verwendung unterstützt. Wenn Sie kopflos auf den 2. Weg gehen, könnten etwa 10% der Internetnutzer nicht auf Ihre Webapplikation zugreifen. Das ist wirklich keine oneliner Aufgabe.

Hier finden Sie hier ein erweitertes Beispiel für eine FileServlet welche unterstützt unter jedem Gzip und überprüft das anhand der Anforderungsheader. Sie können daraus neue Erkenntnisse gewinnen.

    
BalusC 07.12.2009 22:46
quelle
1

Wenn Sie wirklich, wirklich nicht mehr mit dem Java-Code herumspielen wollen, könnten Sie auch in Erwägung ziehen, einen Apache-Server vor Ihren Servlet-Container zu hängen.

Wenn Sie viel statischen Inhalt haben, könnte dies die Performance für Sie verbessern, da der Apache für statische Seiten etwas schneller ist als jeder Servlet-Container. Sie würden es so konfigurieren, dass nur Servlet-Anfragen an Ihren Servlet-Container auf localhost delegiert werden.

Apache verfügt über praktische integrierte Optionen zum Komprimieren der Ausgabe. Ich kann mich nicht daran erinnern, wie ich sie einstellen soll, aber es ist einfach und vielseitig. Sie verhandelt mit den Browsern darüber, was sie handhaben können und so weiter. Im Zweifelsfall ist Apache in der Regel kompromissloser und aktueller bei Komprimierungsmethoden als jeder Java-Container.

    
Carl Smotricz 07.12.2009 22:04
quelle
1

Wenn Sie auf Tomcat sind, kann der Connector für Sie komprimieren. Das ist meine Konfiguration,

%Vor%

Wenn Sie Apache httpd vor Tomcat ausführen, sollten Sie mod_gzip verwenden, was eine viel bessere Arbeit leistet.

    
ZZ Coder 08.12.2009 01:19
quelle
1

Ich wollte nur wissen lassen, was ich getan habe.

Ich habe einen Wrapper der Anfrageklasse erstellt, der folgendermaßen aussieht:

%Vor%

Und dann auf meinem BaseAction , das ist im Grunde ein TemplateMethod für andere "Aktionen" Ich wickle die Antwort so:

%Vor%

Ich denke, es ist sauber genug. Wenn Sie etwas finden, das verbessert werden kann, lassen Sie es mich wissen. Danke an alle für die Antworten!

    
Pablo Fernandez 08.12.2009 02:58
quelle

Tags und Links