Wir verwenden Spring Boot / MVC mit annotationsbasierter Java-Konfiguration für eine Reihe von RESTful
Diensten und möchten die HTTP GZIP
Stream-Komprimierung für einige API-Antworten selektiv aktivieren .
Ich weiß, dass ich dies manuell in meinem Controller und einem Controller byte[] @ResponseBody
ausführen kann. Wir würden uns jedoch lieber auf die SpringMVC-Infrastruktur (Filter / usw.) verlassen und diese automatisch die JSON-Konvertierung und -Komprimierung durchführen lassen (dh die Methode gibt ein POJO zurück).
Wie kann ich die GZIP-Komprimierung in der ResponseBody- oder eingebetteten Tomcat-Instanz aktivieren und so können wir nur einige Antworten selektiv komprimieren?
Vielen Dank!
PS.: Wir haben derzeit keine XML-basierte Konfiguration.
quelle
Antworten:
Der Rest dieser Antworten ist veraltet und / oder übertrieben kompliziert für etwas, das einfach sein sollte IMO (wie lange gibt es gzip schon? Länger als Java ...) Aus den Dokumenten:
In application.properties 1.3+
In application.properties 1.2.2 - <1.3
Älter als 1.2.2:
Beachten Sie auch, dass dies NUR funktioniert, wenn Sie Embedded Tomcat ausführen:
Wenn Sie die Bereitstellung auf einem nicht eingebetteten Tomcat planen, müssen Sie diese in server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation aktivieren
IRL-Produktionshinweis:
Um all dies zu vermeiden, sollten Sie ein Proxy / Load Balancer-Setup vor Tomcat mit nginx und / oder haproxy oder ähnlichem verwenden, da es statische Assets und gzip VIEL effizienter und einfacher handhabt als das Threading-Modell von Java / Tomcat.
Sie möchten die Katze nicht in die Badewanne werfen, weil sie damit beschäftigt ist, Dinge zu komprimieren, anstatt Anforderungen zu bedienen (oder eher Threads zu spinnen / CPU / Heap zu essen, während Sie Ihre AWS-Rechnung ausführen) warum traditionelles Java / Tomcat vielleicht keine gute Idee ist, je nachdem, was Sie tun, aber ich schweife ab ...)
Refs: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/howto.html#how-to-enable-http-response-compression
https://github.com/spring-projects/spring-boot/issues/2031
quelle
TomcatConnectorCustomizer
Instanzen im Anwendungskontext sucht . Sie müssen programmatisch registriert werden beiTomcatEmbeddedServletContainerFactory
server.compression.min-response-size=10240
In den letzten Versionen in der
application.yml
Konfiguration:quelle
Dies ist im Grunde die gleiche Lösung wie bei @ andy-wilkinson, aber ab Spring Boot 1.0 verfügt die Methode customize (...) über den Parameter ConfigurableEmbeddedServletContainer .
Eine andere erwähnenswerte Sache ist, dass Tomcat nur Inhaltstypen von komprimiert
text/html
,text/xml
undtext/plain
standardmäßig aktiviert . Unten sehen Sie ein Beispiel, das auch die Komprimierung von unterstütztapplication/json
:quelle
Accept-Encoding: gzip,deflate
Headercurl -i -H 'Accept-Encoding: gzip,deflate' http://url.to.your.server
Spring Boot 1.4 Verwenden Sie dies für Javascript HTML Json alle Komprimierungen.
quelle
Content-Encoding
:gzip
Ich habe dazu hinzugefügt:
Serverkomprimierung
entnommen aus http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
quelle
Das Beschriften von GZip in Tomcat hat in meinem Spring Boot-Projekt nicht funktioniert. Ich habe CompressingFilter verwendet, das hier zu finden ist .
quelle
Um die GZIP-Komprimierung zu aktivieren, müssen Sie die Konfiguration der eingebetteten Tomcat-Instanz ändern. Dazu deklarieren Sie eine
EmbeddedServletContainerCustomizer
Bean in Ihrer Java-Konfiguration und registrieren eineTomcatConnectorCustomizer
bei dieser.Beispielsweise:
Weitere Informationen zu den verschiedenen verfügbaren Komprimierungskonfigurationsoptionen finden Sie in der Tomcat-Dokumentation .
Sie sagen, dass Sie die Komprimierung selektiv aktivieren möchten. Abhängig von Ihren Auswahlkriterien kann der oben beschriebene Ansatz ausreichend sein. Sie können die Komprimierung über den Benutzeragenten der Anforderung, die Größe der Antwort und den MIME-Typ der Antwort steuern.
Wenn dies nicht Ihren Anforderungen entspricht, müssen Sie meines Erachtens die Komprimierung in Ihrem Controller durchführen und eine Byte [] -Antwort mit einem gzip-Inhaltscodierungsheader zurückgeben.
quelle
Ich hatte das gleiche Problem in meinem Spring Boot + Spring Data-Projekt beim Aufrufen von a
@RepositoryRestResource
.Das Problem ist der zurückgegebene MIME-Typ. das ist
application/hal+json
. Das Hinzufügen zurserver.compression.mime-types
Eigenschaft löste dieses Problem für mich.Hoffe das hilft jemand anderem!
quelle