Nous utilisons Spring Boot / MVC avec java-config basé sur des annotations pour une série de RESTful
services et nous voulons activer sélectivement la HTTP GZIP
compression de flux sur certaines réponses d'API.
Je sais que je peux le faire manuellement dans mon contrôleur et un byte[] @ResponseBody
, mais nous préférerions nous fier à l'infrastructure SpringMVC (filtres / etc) et lui faire faire automatiquement la conversion et la compression JSON (c'est-à-dire que la méthode renvoie un POJO).
Comment puis-je activer la compression GZIP dans ResponseBody ou l'instance Tomcat intégrée, et d'une manière que nous pouvons compresser de manière sélective uniquement certaines réponses?
Merci!
PS: Nous n'avons actuellement aucune configuration basée sur XML.
la source
Réponses:
Le reste de ces réponses est obsolète et / ou trop compliqué pour quelque chose qui devrait être simple IMO (depuis combien de temps gzip existe-t-il? Plus longtemps que Java ...)
Dans application.properties 1.3+
Dans application.properties 1.2.2 - <1.3
Plus de 1.2.2:
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 dans server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation
Note de production IRL:
Aussi, 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 les actifs statiques et gzip BEAUCOUP plus efficacement et plus facilement que le modèle de thread de Java / Tomcat.
Vous ne voulez pas jeter `` chat dans le bain parce qu'il est occupé à compresser des choses au lieu de servir des demandes (ou plus probablement à faire tourner des threads / à manger du processeur / du tas en attendant que l'E / S de la base de données se produise lors de l'exécution de votre facture AWS qui est pourquoi Java / Tomcat traditionnel n'est peut-être pas une bonne idée pour commencer en fonction de ce que vous faites mais je m'égare ...)
réfs: 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
la source
TomcatConnectorCustomizer
instances dans le contexte de l'application; ils doivent être enregistrés par programme avecTomcatEmbeddedServletContainerFactory
server.compression.min-response-size=10240
Sur les versions récentes de la
application.yml
configuration:la source
C'est fondamentalement la même solution que @ andy-wilkinson fournie, mais à partir de Spring Boot 1.0, la méthode de personnalisation (...) a un paramètre ConfigurableEmbeddedServletContainer .
Une autre chose qui est utile de mentionner que Tomcat ne compresse que les types de contenu de
text/html
,text/xml
ettext/plain
par défaut. Voici un exemple qui prend également en charge la compression deapplication/json
:la source
Accept-Encoding: gzip,deflate
tête, si vous utilisez curl:curl -i -H 'Accept-Encoding: gzip,deflate' http://url.to.your.server
Spring Boot 1.4 Utilisez ceci pour Javascript HTML Json toutes les compressions.
la source
Content-Encoding
:gzip
J'ai ajouté pour cela:
Compression du serveur
extrait de http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
la source
L'activation de GZip dans Tomcat ne fonctionne pas dans mon projet Spring Boot. J'ai utilisé CompressingFilter trouvé ici .
la source
Pour activer la compression GZIP, vous devez modifier la configuration de l'instance Tomcat intégrée. Pour ce faire, vous déclarez un
EmbeddedServletContainerCustomizer
bean dans votre configuration Java puis enregistrez unTomcatConnectorCustomizer
avec lui.Par exemple:
Consultez la documentation Tomcat pour plus de détails sur les différentes options de configuration de compression disponibles.
Vous dites que vous souhaitez activer sélectivement la compression. Selon vos critères de sélection, alors l'approche ci-dessus peut être suffisante. Il vous permet de contrôler la compression par l'agent utilisateur de la requête, la taille de la réponse et le type mime de la réponse.
Si cela ne répond pas à vos besoins, je crois que vous devrez effectuer la compression dans votre contrôleur et renvoyer une réponse byte [] avec un en-tête de codage de contenu gzip.
la source
J'ai eu le même problème dans mon projet Spring Boot + Spring Data lors de l'appel à un fichier
@RepositoryRestResource
.Le problème est le type MIME renvoyé; qui est
application/hal+json
. L'ajouter à laserver.compression.mime-types
propriété a résolu ce problème pour moi.J'espère que cela aide quelqu'un d'autre!
la source