iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >springboot对压缩请求的处理方法
  • 385
分享到

springboot对压缩请求的处理方法

springboot压缩请求springboot请求 2023-05-18 17:05:12 385人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录SpringBoot对压缩请求的处理一、Tomcat设置压缩原理二、银联报文压缩补充:java springbooot使用gzip压缩字符串springboot对压缩请求的处理

springboot对压缩请求的处理

最近对接银联需求,为了节省带宽,需要对报文进行压缩处理。但是使用springboot自带的压缩设置不起作用:

server.compression.enabled=true
server.compression.mime-types=application/javascript,text/CSS,application/JSON,application/xml,text/html,text/xml,text/plain
server.compression.compressionMinSize=10

server.compression.enabled:表示是否开启压缩,默认开启,true:开启,false:不开启
server.compression.mime-types:压缩的内容的类型,有xml,json,html等格式
server.compression.compressionMinSize:开启压缩数据最小长度,单位为字节,默认是2048字节
源码如下:

public class Compression {
    private boolean enabled = false;
    private String[] mimeTypes = new String[]{"text/html", "text/xml", "text/plain", "text/css", "text/javascript", "application/javascript", "application/json", "application/xml"};
    private String[] excludedUserAgents = null;
    private int minResponseSize = 2048;
}

一、Tomcat设置压缩原理

tomcat压缩是对响应报文进行压缩,当请求头中存在accept-encoding时,如果Tomcat设置了压缩,则会在响应时对数据进行压缩。
tomcat压缩源码是在Http11Processor中设置的:

public class Http11Processor extends AbstractProcessor {
  private boolean useCompression() {
        // Check if browser support gzip encoding
        MessageBytes acceptEncodingMB =
            request.getMimeHeaders().getValue("accept-encoding");
        if ((acceptEncodingMB == null)-->当请求头没有这个字段是不进行压缩
            || (acceptEncodingMB.indexOf("gzip") == -1)) {
            return false;
        }
        // If force mode, always compress (test purposes only)
        if (compressionLevel == 2) {
            return true;
        }
        // Check for incompatible Browser
        if (noCompressionUserAgents != null) {
            MessageBytes userAgentValueMB =
                request.getMimeHeaders().getValue("user-agent");
            if(userAgentValueMB != null) {
                String userAgentValue = userAgentValueMB.toString();
                if (noCompressionUserAgents.matcher(userAgentValue).matches()) {
                    return false;
                }
            }
        }
        return true;
    }
}

二、银联报文压缩

作为发卡机构,银联报文请求报文是压缩的,且报文头中不存在accept-encoding字段,无法直接使用tomcat配置进行压缩解压。
需要单独处理这种请求

@RestController
@RequestMapping("/user")
public class UserController {
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);
    
    @PostMapping(path = "/test", produces = MediaType.APPLICATION_XML_VALUE, consumes = MediaType.APPLICATION_XML_VALUE)
    public void getUserInfoById(httpservletRequest request, HttpServletResponse response) throws IOException {
        String requestBody;
        String resultBody="hello,wolrd";
        byte[] returnByte;
        if (StringUtils.isNoneEmpty(request.getHeader("Content-encoding"))) {
            logger.info("报文压缩,需要进行解压");
            //业务处理
            //返回报文也同样需要进行压缩处理
            assemleResponse(request,response,resultBody);
        }
    }
    public static void assemleResponse(HttpServletRequest request, HttpServletResponse response,String resultBody) throws IOException {
        response.setHeader("Content-Type","application/xml;charset=UTF-8");
        response.setHeader("Content-Encoding","gzip");
        byte[] returnByte=GzipUtil.compress(resultBody);
        OutputStream outputStream=response.getOutputStream();
        outputStream.write(returnByte);
    }
}
public class GzipUtil {
    public static String uncompress(byte[] bytes){
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        String requestBody=null;
        ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(bytes);
        GZIPInputStream gzipInputStream = null;
        try {
            gzipInputStream = new GZIPInputStream(byteArrayInputStream);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int temp;
            while ((temp = gzipInputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, temp);
            }
            requestBody = new String(byteArrayOutputStream.toByteArray(), StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  requestBody;
    }
    public static String uncompress(HttpServletRequest request){
        String requestBody=null;
        int length = request.getContentLength();
        try {
            BufferedInputStream bufferedInputStream = new BufferedInputStream(request.getInputStream());
            GZIPInputStream gzipInputStream = new GZIPInputStream(bufferedInputStream);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int temp;
            while ((temp = gzipInputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, temp);
            }
            requestBody = new String(byteArrayOutputStream.toByteArray(), StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  requestBody;
    }
    public static byte[] compress(String src){
        if (src == null || src.length() == 0) {
            return null;
        }
        ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
        try {
            GZIPOutputStream gzipOutputStream=new GZIPOutputStream(byteArrayOutputStream);
            gzipOutputStream.write(src.getBytes(StandardCharsets.UTF_8));
            gzipOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] bytes=byteArrayOutputStream.toByteArray();
        return bytes;
    }
}

补充:java springbooot使用gzip压缩字符串

import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

@Slf4j
public class CompressUtils {
    
    public static String compress(String str) {
        if (str == null || str.length() == 0) {
            return str;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip = null;
        try {
            gzip = new GZIPOutputStream(out);
            gzip.write(str.getBytes());
        } catch (IOException e) {
            log.error("",e);
        } finally {
            if (gzip != null) {
                try {
                    gzip.close();
                } catch (IOException e) {
                    log.error("",e);
                }
            }
        }
        return new sun.misc.BASE64Encoder().encode(out.toByteArray());
//        return str;
    }
    
    public static String uncompress(String str) {
        if (str == null) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = null;
        GZIPInputStream ginzip = null;
        byte[] compressed = null;
        String decompressed = null;
        try {
            compressed = new sun.misc.BASE64Decoder().decodeBuffer(str);
            in = new ByteArrayInputStream(compressed);
            ginzip = new GZIPInputStream(in);
            byte[] buffer = new byte[1024];
            int offset = -1;
            while ((offset = ginzip.read(buffer)) != -1) {
                out.write(buffer, 0, offset);
            }
            decompressed = out.toString();
        } catch (IOException e) {
            log.error("",e);
        } finally {
            if (ginzip != null) {
                try {
                    ginzip.close();
                } catch (IOException e) {
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                }
            }
        }
        return decompressed;
    }
}

到此这篇关于springboot对压缩请求的处理的文章就介绍到这了,更多相关springboot压缩请求内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: springboot对压缩请求的处理方法

本文链接: https://www.lsjlt.com/news/212217.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot对压缩请求的处理方法
    目录springboot对压缩请求的处理一、Tomcat设置压缩原理二、银联报文压缩补充:java springbooot使用gzip压缩字符串springboot对压缩请求的处理 ...
    99+
    2023-05-18
    springboot压缩请求 springboot请求
  • Nginx请求压缩的实现(动态压缩,静态压缩)
    目录一、介绍二、请求压缩的流程三、Gzip压缩3.1 gzip介绍3.2 gzip的使用3.3 gzip的请求3.4 静态压缩四、Brotli4.1 Brotli 概述4.2 Bro...
    99+
    2023-03-03
    Nginx 请求压缩 Nginx 压缩
  • SpringBoot配置Controller实现Web请求处理的方法
    今天小编给大家分享的是SpringBoot配置Controller实现Web请求处理的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。Controller处理请求由于 在建立 Sp...
    99+
    2023-08-03
  • SpringBoot常见get/post请求参数处理的方法
    这篇文章主要介绍了SpringBoot常见get/post请求参数处理的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot常见get/post请求参数处理的方法文章都会有所收获,下面我们一起...
    99+
    2023-06-29
  • SpringBoot详解各类请求和响应的处理方法
    目录1. HttpServletRequest与HttpServletResponse2. GET类型的请求2.1 /studentscurrent=1&limit=202....
    99+
    2024-04-02
  • 浏览器请求流程和PHP对请求的处理方法是什么
    这篇“浏览器请求流程和PHP对请求的处理方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“浏览器请求流程和PHP对请求...
    99+
    2023-07-05
  • SpringMVCajax请求的处理方法介绍
    目录准备工作一、@RequestBody二、@RequestBody获取json格式的请求参数三、@ResponseBody四、@ResponseBody响应浏览器json数据五、@...
    99+
    2022-11-13
    SpringMVC ajax请求 SpringMVC ajax
  • Linux分卷压缩与解压缩的方法
    这篇文章主要讲解了“Linux分卷压缩与解压缩的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux分卷压缩与解压缩的方法”吧!举例说明:要将目录logs打包压缩并分割成多个1M的文...
    99+
    2023-06-05
  • vue-cli3打包时图片压缩处理的方法
    本篇内容介绍了“vue-cli3打包时图片压缩处理的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue-cli3打包时图片压缩当我们在...
    99+
    2023-06-29
  • Python3压缩和解压缩的实现方法
    这篇文章主要为大家展示了Python3压缩和解压缩的实现方法,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Python3压缩和解压缩的实现方法”这篇文章吧。python可以做什么Python是一种...
    99+
    2023-06-06
  • SpringBoot多线程进行异步请求的处理方式
    目录SpringBoot多线程进行异步请求的处理第一步:编写配置类第二步:对方法使用注解标注为使用多线程进行处理SpringBoot请求线程优化使用Callable来实现1、异步调用...
    99+
    2024-04-02
  • Ubuntu压缩和解压缩RAR文件的方法
    本篇内容主要讲解“Ubuntu压缩和解压缩RAR文件的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ubuntu压缩和解压缩RAR文件的方法”吧!方法很简单,一条命令就搞定了:sudo ap...
    99+
    2023-06-13
  • SpringBoot中怎么处理RESTful API请求
    SpringBoot是一个快速开发框架,提供了很多便捷的方式来处理RESTful API请求。在SpringBoot中处理RESTf...
    99+
    2024-03-07
    SpringBoot
  • SpringBoot能同时处理多少请求
    这篇文章主要介绍“SpringBoot能同时处理多少请求”,在日常操作中,相信很多人在SpringBoot能同时处理多少请求问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot能同时处理多少请求...
    99+
    2023-07-05
  • PHP中POST请求参数的处理方法
    PHP中POST请求参数的处理方法 在PHP中,POST请求是一种常见的数据传递方式,通常用于向服务器提交表单数据或其他需要保密的数据。处理POST请求参数是开发者常见的需求,在下面的...
    99+
    2024-04-02
  • php处理post请求的方法是什么
    在PHP中处理POST请求的方法是使用$_POST超全局变量来获取POST请求的数据。$_POST是一个关联数组,它包含了所有的PO...
    99+
    2023-10-10
    PHP
  • CSS压缩与CSS代码压缩还原的方法
    本文小编为大家详细介绍“CSS压缩与CSS代码压缩还原的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“CSS压缩与CSS代码压缩还原的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2024-04-02
  • Hadoop中的压缩与解压缩方法是什么
    这篇文章主要介绍“Hadoop中的压缩与解压缩方法是什么”,在日常操作中,相信很多人在Hadoop中的压缩与解压缩方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hadoop中的压缩与解压缩方法是什么...
    99+
    2023-06-21
  • django异步请求处理的方法是什么
    Django中的异步请求处理可以通过以下几种方法实现:1. 使用Django的内置异步任务处理机制:Django提供了一个名为`as...
    99+
    2023-09-26
    Django
  • Linux中有哪些压缩格式的压缩与解压方法
    Linux中有哪些压缩格式的压缩与解压方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于P...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作