Gzip 压缩在我的 Spring boot 1.5.10.RELEASE 项目中不起作用

Sta*_*low 14 java gzip angularjs spring-boot

我正在使用 Spring Boot 1.5.10.RELEASE 版本。Gzip 压缩不起作用。

http://localhost:9000 --> http://localhost:8080/api/..

不同端口上的 Angularjs 和 rest api。启用 CrossOrigin 以接受来自 angularjs ui 的请求。

使用嵌入式 tomcat 服务器部署 spring boot 应用程序。不使用 http2 属性即server.http2.enabled=true

Angualrjs 调用 rest api。以下是 $http 服务

$http({
  method: method,
  url: url,
  params: params,
  data: body,
  headers: {
    Authorization: token,
    "Content-type": 'application/json'
  }
});
Run Code Online (Sandbox Code Playgroud)

休息 api 响应大小大约 25 MB,所以我想压缩响应。

我在application.properties 中添加了众所周知的属性来应用 gzip 压缩。 Spring Boot 1.5.10 支持的属性

# Enable response compression
server.compression.enabled=true

# The comma-separated list of mime types that should be compressed
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json

# Compress the response only if the response size is at least 1KB
server.compression.min-response-size=1024
Run Code Online (Sandbox Code Playgroud)

我已经观察到网络选项卡并且没有观察到Content-Encoding: gzip在响应头中。

要求

Request URL: http://localhost:9081/employee
Request Method: GET
Status Code: 200 
Remote Address: [::1]:9081
Referrer Policy: no-referrer-when-downgrade
Run Code Online (Sandbox Code Playgroud)

响应头

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:7000
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Type: application/json;charset=UTF-8
Date: Sun, 28 Jun 2020 18:15:17 GMT
Expires: 0
Pragma: no-cache
Set-Cookie: JSESSIONID=6E7C07874D0329E18A0C07E5E303F005; Path=/; HttpOnly
Transfer-Encoding: chunked
Vary: Origin
X-Application-Context: application
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Run Code Online (Sandbox Code Playgroud)

请求头

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Authorization: Bearer eyJhbGciOiJIUzINiJ9.eyJyb2xlIjiU0VDVE9SSEVBRCIsImxldmVsRG93biI6IkVENzA0MTI7TU04MzcyNDtKTDgzNTwO0RNNDAwNzE7Skc3MzA0NjtFQzM0NjEzO05OMTY5Nzk7QUs2MDYzNztTVDE4NTg4O0FTMjczNTE7Q0I4MTg3OTtWQTc4MTk5O0NNOTM3MDA7QVkyMzYzNztKUzcwMDY4O0NCMTc2NzE7TksyMTU2MDtMUzg4OTg0O0FQNTg3MDg7VFcyjk0NTtKSzI1Nzc3O01TNDk5MjE7SkI4OTcyOTtNSDAyMTI3O01CMTUwODk7SU0xMjgwODtNQzcxOTc2O1JSMjAzMDI7TFM1ODk4MiIsImxldmVsVXAiOm51bGwsImRlbGVnYXRlZCI6bnVsbCwic29lSWQiOiJTUjQ0MTg1I0.*************
Cache-Control: no-cache
Connection: keep-alive
Content-type: application/json
Host: localhost:9081
Origin: http://localhost:7000
Pragma: no-cache
Referer: http://localhost:7000/build/standalone.html
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
Run Code Online (Sandbox Code Playgroud)

我没有在响应标头中遵循预期的标头

Content-Encoding: gzip
Vary: Accept-Encoding
Run Code Online (Sandbox Code Playgroud)

客户端/服务器端需要任何更改吗?

---[Edit-1] ------------- 在单个项目中尝试 gzip ,但在我的项目中不起作用。

以下是从浏览器调用rest api时的响应头

Content-Encoding: gzip
Content-Type: application/json;charset=UTF-8
Date: Sun, 28 Jun 2020 18:12:29 GMT
Transfer-Encoding: chunked
Vary: Accept-Encoding
Run Code Online (Sandbox Code Playgroud)

-----[Edit-2]-----Ziplet----

使用ziplet依赖项我可以压缩响应,但我想使用 spring boot gzip 压缩。

响应头 - 使用 Ziplet 时

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:7000
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Encoding: gzip
Content-Type: application/json;charset=UTF-8
Date: Mon, 06 Jul 2020 18:31:07 GMT
Expires: 0
Pragma: no-cache
Set-Cookie: JSESSIONID=8465D2E81A1A9CE146255B6C545FBE30; Path=/; HttpOnly
Transfer-Encoding: chunked
Vary: Accept-Encoding
Vary: Origin
X-Application-Context: application
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Run Code Online (Sandbox Code Playgroud)

使用 ziplet 时 - 我可以看到 CompressingFilter : CompressingFilter has initialized

当使用 Spring boot gzip 压缩时,没有观察到任何我可以假设启用 gzip 压缩的地方。

使用嵌入式 tomcat 调试 spring boot gzip 压缩的任何属性?比如 logging.level.org.eclipse.jetty.server.handler.gzip=TRACE

如何验证 server.compression.enabled ?

我的项目的客户端/服务器端需要进行任何更改吗?

提前致谢。

小智 -1

您必须在 Spring Boot 属性中启用 http2 支持

  server.http2.enabled=true
Run Code Online (Sandbox Code Playgroud)

然后尝试

  • 这更像是评论而不是答案。您能详细说明一下为什么 gzip 压缩需要 http2 吗?我相信gzip压缩早在http2存在之前就已经存在了,所以这一点还不清楚。 (2认同)