SpringBoot开启server:compression:enabled(Illegal character ((CTRL-CHAR, code 31)))的问题解决

 更新时间:2025年03月14日 10:16:12   作者:techzhi  
本文主要介绍了SpringBoot开启server:compression:enabled(Illegal character ((CTRL-CHAR, code 31)))的的问题解决,具有一定的参考价值,感兴趣的可以了解一下

在 Spring Boot 的配置中:

server:
   compression:
     enabled: true
     mime-types: application/json,application/xml,text/html,text/xml,text/plain
     min-response-size: 1024

min-response-size: 1024 的含义是 响应内容的最小大小,以字节为单位。即当响应内容的大小达到或超过 1024 字节时,服务器会对该响应内容进行压缩;如果内容小于 1024 字节,则不会启用压缩。

解释

  • 单位:1024 表示字节(1 KB),这意味着只有响应内容大小超过 1 KB 时,服务器才会对这些内容进行压缩。
  • 作用:避免对小型响应进行压缩,因为压缩较小的数据可能反而增加开销,对性能没有显著的提升。

示例

  • 如果返回的数据大小为 500 字节(小于 1024 字节),则不会压缩。
  • 如果返回的数据大小为 1500 字节(大于 1024 字节),则会启用压缩。

通过配置 min-response-size 可以优化服务器性能,使压缩只应用于较大的响应内容。

引入带来的问题

在这里插入图片描述

解决问题

开启压缩后,服务器会将响应数据以 GZIP 压缩的形式发送给客户端。如果客户端没有正确解压缩这些数据,可能会导致解析失败,因为客户端会尝试将压缩的字节流当作普通文本来读取,结果出现序列化异常。

解决方案

确认客户端支持解压缩

确保客户端支持并正确处理 GZIP 压缩的数据。在大多数 HTTP 客户端(如浏览器、Postman、Spring RestTemplate)中,设置 Accept-Encoding: gzip, deflate 请求头会自动解压缩响应内容。

检查是否自动解压缩(Spring RestTemplate 示例)

HttpHeaders headers = new HttpHeaders();
headers.add("Accept-Encoding", "gzip, deflate");

HttpEntity<String> requestEntity = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, String.class);

如果使用 Spring 的 RestTemplate 作为客户端,它应该能够自动处理 GZIP 响应,但确保请求头包含 Accept-Encoding: gzip, deflate

关闭 GZIP 压缩(临时解决方案)

server:
  compression:
    enabled: false

如果您无法保证客户端正确解压缩数据,可以考虑在服务器端禁用压缩以避免异常:

调整 MIME 类型

server:
  compression:
    enabled: true
    mime-types: application/xml,text/html,text/xml,text/plain  # 排除 application/json
    min-response-size: 1024

如果只希望压缩特定类型的响应(例如,HTML 和 XML),可以修改 mime-types 配置,排除 application/json

通过上述调整,您可以避免由于压缩导致的客户端解析错误。最优方案是确保客户端正确处理 GZIP 响应,避免禁用压缩带来的性能影响。

到此这篇关于SpringBoot开启server:compression:enabled(Illegal character ((CTRL-CHAR, code 31)))的实现的文章就介绍到这了,更多相关SpringBoot开启server:compression:enabled内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot SpringEL表达式的使用

    SpringBoot SpringEL表达式的使用

    本文主要介绍了SpringEL表达式的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java中的CountDownLatch、CyclicBarrier和semaphore实现原理解读

    Java中的CountDownLatch、CyclicBarrier和semaphore实现原理解读

    这篇文章主要介绍了Java中的CountDownLatch、CyclicBarrier和semaphore实现原理详解,CountDownLatch中调用await方法线程需要等待所有调用countDown方法的线程执行,这就很适合一个业务需要一些准备条件,等准备条件准备好之后再继续执行,需要的朋友可以参考下
    2023-12-12
  • ruoyi微服务版本搭建运行方式

    ruoyi微服务版本搭建运行方式

    这篇文章主要介绍了ruoyi微服务版本搭建运行方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • mybatis 忽略实体对象的某个属性(2种方式)

    mybatis 忽略实体对象的某个属性(2种方式)

    这篇文章主要介绍了mybatis 忽略实体对象的某个属性方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 详解Java中两种分页遍历的使用姿势

    详解Java中两种分页遍历的使用姿势

    这篇文章主要介绍了详解Java中两种分页遍历的使用姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java使用递归复制文件夹及文件夹

    Java使用递归复制文件夹及文件夹

    这篇文章主要介绍了Java使用递归复制文件夹及文件夹,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java中synchronized关键字的使用和原理详解

    Java中synchronized关键字的使用和原理详解

    这篇文章主要介绍了Java中synchronized关键字的使用和原理详解,JVM 是通过进入、退出 对象监视器(Monitor)来实现对方法、同步块的同步的,而对象监视器的本质依赖于底层操作系统的互斥锁实现,需要的朋友可以参考下
    2023-09-09
  • MyBatis-plus实现逆向生成器

    MyBatis-plus实现逆向生成器

    本文主要介绍了MyBatis-plus实现逆向生成器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java中Klass模型与类加载的详细机制

    Java中Klass模型与类加载的详细机制

    这篇文章主要介绍了Java中Klass模型与类加载的详细机制,java语言是在jvm中运行而jvm是不认识java代码的我们使用javac编译的class文件jvm是不认识的 所以有一个类加载的动作 这个动作就是把class字节码拼装成一个klass类型,需要的朋友可以参考下
    2023-08-08
  • Java中关于控制台读取数字或字符串的方法

    Java中关于控制台读取数字或字符串的方法

    下面小编就为大家带来一篇Java中关于控制台读取数字或字符串的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10

最新评论