当前位置: 首页 > article >正文

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

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

问题

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

方案

注解方式压缩后端给前端的返回数据,注解@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开启Gzip
            if (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.kler.cn/news/358675.html

相关文章:

  • 代码工具箱:18个实用的 JavaScript 函数
  • pytorch 张量的masked_fill函数介绍
  • flutter TabBar自定义指示器(带文字的指示器、上弦弧形指示器、条形背景指示器、渐变色的指示器)
  • Atlas800昇腾服务器(型号:3000)—YOLO全系列NPU推理【检测】(五)
  • Navicat连接openGauss数据库详细指南
  • Vue3在大数据场景下原生实现单元格合并,让Thead固定让Tbody滚动
  • Linux——传输层协议
  • vscode 远程linux服务器 连接git
  • 陈文自媒体:小红书,24小时爆99+的秘诀!
  • 视觉检测解决方案
  • 3D Slicer 教程三 ---- 坐标系
  • 小技巧——如何启动miivii控制器自带相机demo
  • 单细胞分析 | Cicero+Signac 寻找顺式共可及网络
  • c#webapi远程调试方法asp.netcore
  • 【思维导图】C语言
  • 【C语言】指针进阶【万字详细版】
  • 使用langchain和大模型API提取QA的实战教程
  • RHEL: rpm2cpio: signature hdr data: BAD, no. of bytes(19987) out of range
  • 【基于Spring Boot+Unipp的古诗词学习小程序【原创】
  • lazyLoad