Utilisation de la compression GZIP avec Spring Boot / MVC / JavaConfig avec RESTful

Nous utilisons Spring Boot / MVC avec java-config basé sur des annotations pour les séries de services RESTful et nous voulons activer de manière sélective la compression de stream HTTP GZIP sur certaines réponses de l’API.

Je sais que je peux le faire manuellement dans mon contrôleur et dans un byte[] @ResponseBody , mais nous préférons nous baser sur l’infrastructure SpringMVC (filtres / etc) pour faire automatiquement la conversion et la compression JSON (la méthode retourne un POJO).

Comment puis-je activer la compression GZIP dans l’instance ResponseBody ou Tomcat intégrée et, d’une certaine manière, nous pouvons compresser de manière sélective uniquement certaines réponses?

Merci!

PS: Nous n’avons actuellement aucune configuration basée sur XML.

Le rest de ces réponses est obsolète et / ou compliqué pour quelque chose qui devrait être simple IMO (depuis combien de temps gzip existe-t-il depuis plus longtemps que Java …)?

Dans application.properties 1.3+

 server.compression.enabled=true server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css 

Dans application.properties 1.2.2 – <1.3

 server.tomcat.compression: on server.tomcat.compressableMimeTypes=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css 

Plus ancien que 1.2.2:

 @Component public class TomcatCustomizer implements TomcatConnectorCustomizer { @Override public void customize(Connector connector) { connector.setProperty("compression", "on"); // Add json and xml mime types, as they're not in the mimetype list by default connector.setProperty("compressableMimeType", "text/html,text/xml,text/plain,application/json,application/xml"); } } 

Notez également que cela fonctionnera UNIQUEMENT si vous exécutez tomcat intégré:

Si vous prévoyez de déployer sur un tomcat non intégré, vous devrez l’activer server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation

IRL Note de production:

Pour éviter tout cela, envisagez d’utiliser une configuration de proxy / équilibreur de charge devant Tomcat avec nginx et / ou haproxy ou similaire, car il gérera des ressources statiques et gzip BEAUCOUP plus efficacement et plus facilement que le modèle de threads de Java / Tomcat.

Vous ne voulez pas lancer “cat dans le bain car il est occupé à compresser des trucs au lieu de servir des requêtes (ou plus probablement des threads en train de tourner / manger des CPU / heap en attente pourquoi Java / Tomcat traditionnel n’est peut-être pas une bonne idée en fonction de ce que vous faites mais je m’éloigne …

réfs: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#how-to-enable-http-response-compression

https://github.com/spring-projects/spring-boot/issues/2031

Ceci est fondamentalement la même solution que @ andy-wilkinson fournie, mais depuis Spring Boot 1.0, la méthode de personnalisation (…) a un paramètre ConfigurableEmbeddedServletContainer .

Une autre chose qui mérite d’être mentionnée est que Tomcat ne compresse que les types de contenu text/html , text/xml et text/plain par défaut. Voici un exemple qui prend également en charge la compression d’ application/json :

 @Bean public EmbeddedServletContainerCustomizer servletContainerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer servletContainer) { ((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers( new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler(); httpProtocol.setCompression("on"); httpProtocol.setCompressionMinSize(256); Ssortingng mimeTypes = httpProtocol.getCompressableMimeTypes(); Ssortingng mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE; httpProtocol.setCompressableMimeTypes(mimeTypesWithJson); } } ); } }; } 

Sur les versions application.yml configuration de application.yml :

 --- spring: profiles: dev server: compression: enabled: true mime-types: text/html,text/css,application/javascript,application/json --- 

Spring Boot 1.4 Utilisez ceci pour Javascript HTML Json toutes les compressions.

 server.compression.enabled: true server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript 

Pour activer la compression GZIP, vous devez modifier la configuration de l’instance Tomcat intégrée. Pour ce faire, vous déclarez un bean EmbeddedServletContainerCustomizer dans votre configuration Java, puis vous enregistrez un TomcatConnectorCustomizer .

Par exemple:

 @Bean public EmbeddedServletContainerCustomizer servletContainerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainerFactory factory) { ((TomcatEmbeddedServletContainerFactory) factory).addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler(); httpProtocol.setCompression("on"); httpProtocol.setCompressionMinSize(64); } }); } }; } 

Consultez la documentation Tomcat pour plus de détails sur les différentes options de configuration de compression disponibles.

Vous dites que vous voulez activer sélectivement la compression. Selon vos critères de sélection, l’approche ci-dessus peut suffire. Il vous permet de contrôler la compression en fonction de l’agent utilisateur de la requête, de la taille de la réponse et du type MIME de la réponse.

Si cela ne répond pas à vos besoins, je pense que vous devrez effectuer la compression dans votre contrôleur et renvoyer une réponse octet [] avec un en-tête de codage de contenu gzip.

L’étiquetage de GZip dans Tomcat n’a pas fonctionné dans mon projet d’amorçage de spring. J’ai utilisé CompressingFilter trouvé ici .

 @Bean public Filter compressingFilter() { CompressingFilter compressingFilter = new CompressingFilter(); return compressingFilter; } 

J’ai ajouté pour cela:

Compression du serveur

 server.compression.enabled=true server.compression.min-response-size=2048 server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain 

extrait de http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/

J’ai eu le même problème dans mon projet Spring Boot + Spring Data lors de l’appel à un @RepositoryRestResource .

Le problème est le type MIME renvoyé; qui est application/hal+json . L’append à la propriété server.compression.mime-types résolu ce problème pour moi.

J’espère que cela aide quelqu’un d’autre!