解决后端给前端的返回数据过大的问题(压缩)

server/2024/10/25 7:18:37/

解决后端前端返回数据过大的问题(压缩

问题

后端返回数据过大导致的前端接收数据慢的问题

方案

注解方式压缩后端前端返回数据注解@Gzip压缩后端返回数据前端不用做任何处理)


import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.util.Objects;
import java.util.zip.GZIPOutputStream;@Aspect
@Slf4j
@Component
public class GzipAspect {@Pointcut("@annotation(com.xxx.xxx.xxx.annotation.gzip.Gzip)")public void gzipAnnotation() {}@AfterReturning(pointcut = "gzipAnnotation()", returning = "result")public void applyGzipCompression(JoinPoint joinPoint, Object result) {HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse();if (Objects.isNull(response)) return;try {ObjectMapper mapper = new ObjectMapper();byte[] data = mapper.writeValueAsBytes(result);// 当返回体大于2048KB开启Gzipif (data.length < 2048 * 1024) {return;}response.setHeader("Content-Encoding", "gzip");response.setHeader("Vary", "Accept-Encoding");ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);gzipOutputStream.write(data);gzipOutputStream.close();byte[] compressedData = byteArrayOutputStream.toByteArray();response.setContentLength(compressedData.length);ServletOutputStream servletOutputStream = response.getOutputStream();servletOutputStream.write(compressedData);servletOutputStream.flush();servletOutputStream.close();} catch (Throwable e) {log.error("开启Gzip返回失败");log.error(e.getMessage());}}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 对标注有@Gzip的接口进行gzip算法压缩**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Gzip {
}

使用:直接将注解@Gzip加在对应接口的controller方法上面


http://www.ppmy.cn/server/134641.html

相关文章

基于ElementPlus的Form组件封装

前言 我们在项目开发过程中遇到最多就是表单页面的开发&#xff0c;那么使用频率比较高的就是Form组件&#xff0c;无论是vue亦或者是react&#xff0c;我们在项目中使用到UI库都会有Form组件。多数情况下都是用到了Form组件&#xff0c;我们先根据UI库或者其他类似的页面直接…

自动驾驶系列—图像数据在自动驾驶中的关键角色及其实际应用场景探讨

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

微信小程序美团点餐

引言&#xff1a;外卖已经成为了都市人的必备&#xff0c;在无数个来不及&#xff08;懒得&#xff09;做饭的时刻拯救孤单寂寞的胃。美团外卖无疑是外卖届的领头羊&#xff0c;它的很多功能与设计都值得我们学习。本文将从五个方面&#xff0c;对美团外卖展开产品分析&#xf…

Spring Boot + Vue项目开发学习笔记2

这个笔记是在看B站视频的时候做的&#xff0c;所以肯定是很多直接把课程的ppt的文字直接写下来了或者把老师口述的内容写下来&#xff0c;目的是为了让自己遗忘某些知识点的时候能直接看笔记&#xff0c;应该不至于构成侵权吧&#xff0c;如有不妥望告知&#xff0c;我会删除并…

动态规划之打家劫舍

大纲 题目思路第一步&#xff1a;确定下标含义第二步&#xff1a;确定递推公式第二步&#xff1a;dp数组如何初始化第三步&#xff1a;确定遍历顺序第四步&#xff1a;举例推导dp数组 总结 最近有人询问我 LeetCode 「打家劫舍」系列问题&#xff08;英文版叫 House Robber&…

CentOS 8在Linux虚拟机修改IP地址,出现:错误:“ens160“ 不是活动的连接。错误:未提供活动连接。

问题&#xff1a;错误&#xff1a;"ens160" 不是活动的连接。错误&#xff1a;未提供活动连接。 1.查看网络服务运行状态&#xff1a; 1)CentOS 7执行命令&#xff1a;systemctl status network 2)CentOS 8执行命令&#xff1a;systemctl status NetworkManager&a…

医院信息化与智能化系统(7)

医院信息化与智能化系统(7) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应的…

又是一年 1024

今天是 1024 程序员节&#xff0c;现在是一名大数据讲师&#xff0c;我和往常一样&#xff0c;依旧在讲课中度过。对于很多程序员来说&#xff0c;这一天也许是属于代码、调试和无数行 SQL 查询的&#xff0c;而对于我来说&#xff0c;虽然工作内容不同&#xff0c;却也和数据、…