Usamos Spring Boot / MVC con java-config basado en anotaciones para series de RESTful
servicios y queremos habilitar selectivamente la HTTP GZIP
compresión de transmisión en algunas respuestas API.
Sé que puedo hacer esto manualmente en mi controlador y byte[] @ResponseBody
, sin embargo, preferiríamos confiar en la infraestructura SpringMVC (filtros / etc.) y hacer que automáticamente haga la conversión y compresión JSON (es decir, el método devuelve un POJO).
¿Cómo puedo habilitar la compresión GZIP en ResponseBody o en la instancia incrustada de Tomcat, y de alguna manera podemos comprimir selectivamente solo algunas respuestas?
¡Gracias!
PD: Actualmente no tenemos ninguna configuración basada en XML.
java
rest
spring-mvc
gzip
spring-java-config
usuario3182614
fuente
fuente
Respuestas:
El resto de estas respuestas están desactualizadas y / o son demasiado complicadas para algo que debería ser simple IMO (¿cuánto tiempo ha existido gzip por ahora? Más que Java ...) De los documentos:
En application.properties 1.3+
En application.properties 1.2.2 - <1.3
Mayor que 1.2.2:
También tenga en cuenta que esto SOLO funcionará si está ejecutando tomcat integrado:
Si planea implementar en un Tomcat no integrado, tendrá que habilitarlo en server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation
Nota de producción de IRL:
Además, para evitar todo esto, considere usar una configuración de balanceador de carga / proxy frente a Tomcat con nginx y / o haproxy o similar, ya que manejará activos estáticos y gzip MUCHO más eficiente y fácilmente que el modelo de subprocesos de Java / Tomcat.
No quiere tirar al gato al baño porque está ocupado comprimiendo cosas en lugar de atender solicitudes (o más probablemente girando subprocesos / comiendo CPU / montón esperando que ocurra la E / S de la base de datos mientras se ejecuta su factura de AWS, que es por qué Java / Tomcat tradicional podría no ser una buena idea para empezar dependiendo de lo que esté haciendo, pero estoy divagando ...)
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
fuente
TomcatConnectorCustomizer
instancias en el contexto de la aplicación; Tienen que estar inscrito en programáticamenteTomcatEmbeddedServletContainerFactory
server.compression.min-response-size=10240
En versiones recientes en
application.yml
config:fuente
Esta es básicamente la misma solución que @ andy-wilkinson proporcionó, pero a partir de Spring Boot 1.0, el método personalizar (...) tiene un parámetro ConfigurableEmbeddedServletContainer .
Otra cosa que vale la pena mencionar es que Tomcat solo comprime los tipos de contenido de
text/html
,text/xml
ytext/plain
de forma predeterminada. A continuación, se muestra un ejemplo que también admite la compresión deapplication/json
:fuente
Accept-Encoding: gzip,deflate
encabezado, si está usando curl:curl -i -H 'Accept-Encoding: gzip,deflate' http://url.to.your.server
Spring Boot 1.4 Use esto para Javascript HTML Json todas las compresiones.
fuente
Content-Encoding
:gzip
He agregado para esto:
Compresión del servidor
extraído de http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
fuente
Enabeling GZip en Tomcat no funcionó en mi Spring Boot Project. Usé CompressingFilter que se encuentra aquí .
fuente
Para habilitar la compresión GZIP, debe modificar la configuración de la instancia de Tomcat incorporada. Para hacerlo, declare un
EmbeddedServletContainerCustomizer
bean en su configuración de Java y luego registre unTomcatConnectorCustomizer
con él.Por ejemplo:
Consulte la documentación de Tomcat para obtener más detalles sobre las diversas opciones de configuración de compresión que están disponibles.
Dice que desea habilitar selectivamente la compresión. Dependiendo de sus criterios de selección, el enfoque anterior puede ser suficiente. Le permite controlar la compresión por el agente de usuario de la solicitud, el tamaño de la respuesta y el tipo de mímica de la respuesta.
Si esto no satisface sus necesidades, creo que tendrá que realizar la compresión en su controlador y devolver una respuesta de byte [] con un encabezado de codificación de contenido gzip.
fuente
Tuve el mismo problema en mi proyecto Spring Boot + Spring Data al invocar a
@RepositoryRestResource
.El problema es el tipo MIME devuelto; que es
application/hal+json
. Agregarlo a laserver.compression.mime-types
propiedad resolvió este problema para mí.¡Espero que esto ayude a alguien más!
fuente