编写Filter

/*** GZIP处理Filter*/
@WebFilter(filterName = "httpServletGzipFilter", urlPatterns = "/")
public class HttpServletGzipFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request), response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {}
}@Slf4j
class HttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper {private HttpServletRequest request;public HttpServletRequestWrapper(HttpServletRequest request) {super(request);this.request = request;}/*** 根据 request header 的 Content-Encoding 判断是否启用 gzip 解压数据流* @return* @throws IOException*/@Overridepublic ServletInputStream getInputStream() throws IOException {ServletInputStream stream = request.getInputStream();String contentEncoding = request.getHeader("Content-Encoding");if (null != contentEncoding && contentEncoding.indexOf("gzip") != -1) {try {final GZIPInputStream gzipInputStream = new GZIPInputStream(stream);ServletInputStream newStream = new ServletInputStream() {@Overridepublic int read() throws IOException {return gzipInputStream.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}};return newStream;} catch (Exception e) {log.error("uncompress content fail.", e);}}return stream;}
}

注册Filter交给Spring管理

@Configuration
public class HttpServletFilterConfig {/*** 注册 HttpServletFilter** @return*/@Beanpublic FilterRegistrationBean filterRegistrationBean() {FilterRegistrationBean registrationBean = new FilterRegistrationBean();registrationBean.setFilter(new HttpServletGzipFilter());List<String> urlPatterns = new ArrayList<>();urlPatterns.add("/*");registrationBean.setUrlPatterns(urlPatterns);return registrationBean;}
}

Controller中获取Request body数据

public abstract class BaseController {/*** 获取GZIP解压后的消息体** @param request* @return*/protected String getRequestBody(HttpServletRequest request) {try {ServletInputStream inputStream = request.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line);}return sb.toString();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}
}

测试验证

编写测试请求处理器,并使用okhttp进行验证。

@RestController
@RequestMapping("/gzip")
public class testController extends BaseController {@RequestMapping(value = "/requstData")public String requstData(HttpServletRequest request) {return getRequestBody(request);}
}

编写gzip测试类

public class GzipTest {public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");@Testpublic void gzipTest() {String url = "http://localhost:8080/gzip/requstData";String str = "%5-1sdf22322222sedssf测试sdklasdkgnfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff!@#$%^&****()_+=";try {String responseData = post(url, str);System.out.println(responseData);} catch (IOException e) {e.printStackTrace();}}public String post(String url, String json) throws IOException {OkHttpClient client = new OkHttpClient.Builder()// 通过GzipRequestInterceptor类拦截响应,自动处理gzip解压.addInterceptor(new GzipRequestInterceptor()).build();RequestBody body = RequestBody.create(json, JSON);Request request = new Request.Builder().url(url).post(body).build();try (Response response = client.newCall(request).execute()) {return response.body().string();}}class GzipRequestInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {Request originalRequest = chain.request();if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) {return chain.proceed(originalRequest);}Request compressedRequest = originalRequest.newBuilder().header("Content-Encoding", "gzip").method(originalRequest.method(), gzip(originalRequest.body())).build();return chain.proceed(compressedRequest);}private RequestBody gzip(final RequestBody body) {return new RequestBody() {@Overridepublic MediaType contentType() {return body.contentType();}@Overridepublic long contentLength() {// We don't know the compressed length in advance!return -1;}@Overridepublic void writeTo(BufferedSink sink) throws IOException {BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));body.writeTo(gzipSink);gzipSink.close();}};}}
}

测试结果

参考文献

https://www.jianshu.com/p/a9d861732445
https://blog.csdn.net/aiynmimi/article/details/77453809

Springboot gzip解压http数据流相关推荐

  1. HTML中chunked解码和gzip解压

    chunked编码 chunked编码的的好处 当访问的时动态页面时,服务器则无法预知内容的大小,因此需要一遍产生数据,一边发送数据,将数据分块发送(服务器通过响应头'Transfer-Encodin ...

  2. httplib 和 httplib2区别之 gzip解压

    HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Content-e ...

  3. 将多个文件压缩成gzip,将gzip解压成多个文件

          第一步:文件压缩和解压缩方法 //解压gzip文件public static boolean extractZip(File file, File parent) {ZipFile zf ...

  4. linux gzip 解压 函数,获取http的gzip内容,并解压

    问题: 入问题,问题答案立即呈现在您眼前! 寻找gzip 获取一个网页数据返回的编码类型是gzip,我该怎么解压缩 HTTP头获取? 如何用vb获取网络上的xml文件,并解析内容 关于GZIP的解码 ...

  5. gzip 解压_简简单单_百度空间

    gzip 解压_简简单单_百度空间 gzip 解压_简简单单_百度空间 问题: 入问题,问题答案立即呈现在您眼前! gzip格式rfc 1952 http://www.ietf.org/rfc/rfc ...

  6. asp.net实现GZip压缩和GZip解压

    最近在开发一个网站doc.115sou.com,使用到了GZip压缩技术,经过多次搜索找到asp.net中用GZip对数据压缩和解压缩非常方便,当我第一次拿到这个类的时候却感觉很迷茫,无从下手.主要是 ...

  7. java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  8. gzip解压str python_有哪些你不知道的Python小工具

    ython作为越来越流行的一种编程语言,不仅仅是因为它语言简单,有许多现成的包可以直接调用. python中还有大量的小工具,让你的python工作更有效率. 1. 快速共享 HTTP服务器 Simp ...

  9. 文件流,gzip解压,压缩

    目录 文件画布 写入 (空文件 Fout=new File(Parent,entry.getName());) FileOutputStream out=new FileOutputStream(Fo ...

  10. 基于pako的gzip解压

    let strData = atob(res.data) let charData = strData.split('').map(function (x) { return x.charCodeAt ...

最新文章

  1. win10下用Linux搭建pythonnodejs开发环境
  2. 数据中心主机房的加湿量和除湿量如何计算
  3. 自相关函数怎么理解,为什么定义中有共轭,卷积呢。定义中的卷积,共轭有什么意义?尤其是在信号处理方面
  4. Tensorflow Serving部署tensorflow、keras模型详解
  5. 计算机二级高级应用考题,2016计算机二级MSOFFICE高级应用考试真题
  6. LeetCode MySQL 262. 行程和用户
  7. hasoffers API 研究
  8. 系统修复对电脑的影响有哪些
  9. [NLP] 酒店名归类
  10. 拓端tecdat|R语言贝叶斯Poisson泊松-正态分布模型分析职业足球比赛进球数
  11. [SQLite]www.sqlite.org官网.NET最新版本所有内容下载
  12. 计算机上未检测到u盾,u盾检测不到-电脑上检测不到我的U盾怎么办? 爱问知识人...
  13. Qt中其他类调用窗口中的ui控件
  14. (端到端多尺度去雾算法)FAMED-Net: A Fast and Accurate Multi-scale End-to-end Dehazing Network
  15. 推荐一个不错的免费的asp空间
  16. 【这很AI】斯坦福新人工智能系统曝光:用算法优化难民工作分配
  17. matlab 矩阵左右乘除
  18. 天猫精灵使用体验之二——家用电器的智能化改造(借助天猫精灵实现家用电器的语音控制)
  19. 安卓游戏《罗马帝国》游戏心得
  20. 生鲜配送系统源码功能介绍

热门文章

  1. ClickHouse安装与引擎
  2. 我的世界java版forge怎么用_我的世界forge怎么安装
  3. qt qtableview 刷新列表_qt qtableview基本用法
  4. Pyside2 背景图片填充
  5. 推荐给中学生的数学课外书:《怎样解题——数学思维的新方法》
  6. 拓扑排序算法 C语言实现
  7. jdk8,jdk10,jdk12新特性
  8. godot正确设置2d像素游戏
  9. 企业业务逻辑常见风险
  10. win7资源监视器介绍