坑记(HttpInputMessage)

2024-01-11 10:52
文章标签 坑记 httpinputmessage

本文主要是介绍坑记(HttpInputMessage),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、背景知识

public interface HttpInputMessage
extends HttpMessage
Represents an HTTP input message, consisting of headers and a readable body.Typically implemented by an HTTP request on the server-side, or a response on the client-side.Since:
3.0
Author:
Arjen Poutsma

在实现接口的加密处理过程中, 我们一般选择使用SpringMVCResponseBodyRequestBody,实现接口报文的监听和处理操作。在监听时,需分别实现相关的Advice类,以帮助完成自己的逻辑实现。交互流程图可以参考:
在这里插入图片描述

HttpInputMessage正是我们需要获取header和请求body的关键。今天我们谈谈使用过程中可能遇到的问题。

二、情况说明

1. 问题描述

我们在实现RequestBodyAdvice时,通常会重写以下方法:

 public HttpInputMessage beforeBodyRead(final HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {//读取请求bodybyte[] body = new byte[inputMessage.getBody().available()];inputMessage.getBody().read(body);
}

如我们使用以上方式,读取请求报文数据时,可能产生“读不完整”的现象。因为InputStream .available()方法描述如下:

public abstract class InputStream implements Closeable {
/*** Returns an estimate of the number of bytes that can be read (or* skipped over) from this input stream without blocking by the next* invocation of a method for this input stream. The next invocation* might be the same thread or another thread.  A single read or skip of this* many bytes will not block, but may read or skip fewer bytes.** <p> Note that while some implementations of {@code InputStream} will return* the total number of bytes in the stream, many will not.  It is* never correct to use the return value of this method to allocate* a buffer intended to hold all data in this stream.** <p> A subclass' implementation of this method may choose to throw an* {@link IOException} if this input stream has been closed by* invoking the {@link #close()} method.** <p> The {@code available} method for class {@code InputStream} always* returns {@code 0}.** <p> This method should be overridden by subclasses.** @return     an estimate of the number of bytes that can be read (or skipped*             over) from this input stream without blocking or {@code 0} when*             it reaches the end of the input stream.* @exception  IOException if an I/O error occurs.*/public int available() throws IOException {return 0;}
}

其中,有一句描述:

many bytes will not block, but may read or skip fewer bytes.

这就厉害了,不阻塞,但是可能丢包…所以如果使用上述方法,读取请求body时,数据并不完整,会导致后续逻辑出现异常。

2. 解决过程

上述方法有问题,可使用这个办法:

String reqBody = StreamUtils.copyToString(inputMessage.getBody(), Charset.defaultCharset());

亲测有效哦~

结束语

多看、多学、多试,总会找到解决的办法和途径。

这篇关于坑记(HttpInputMessage)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/594142

相关文章

【Spring boot】编写代码及测试用例入门之 Hello Spring boot _踩坑记

先贴下目录: 这是我从 start.spring.io 里下载的依赖Web的模板 // DemoApplication.javapackage com.abloume.springboot.blog.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autocon

vue3使用vue-i18n(最全攻略踩坑记)

1.安装vue-i18n "vue-i18n": "^9.2.2", 2.新建locales目录 3.新建index.js // 导入你的本地化消息文件import { createI18n } from "vue-i18n";import enMessages from "./en.json";import zhCNMessages from "./zh-CN.json";im

【来来来,我看看是谁不点我】Nuxt3入坑记--JS版

为什么选择Nuxt3呢? 老板说要上SSR 紧跟潮流 Nuxt3对于没有SSR经验的同学来说,是一个不错的选择,简单易用上手轻松。 Nuxt3官方地址 Nuxt3生态圈 Nuxt3官方案例 Nuxt3具有什么优势呢? 开发更快打包更小支持 vite支持 vue3支持自动引入支持文件路由支持布局系统支持多种渲染模式支持 typescript支持 composition-api Nu

ubuntu18.0.4安装gradio踩坑记

Collecting pandas (from gradio)   Downloading http://mirrors.cloud.aliyuncs.com/pypi/packages/c3/e2/00cacecafbab071c787019f00ad84ca3185952f6bb9bca9550ed83870d4d/pandas-1.1.5-cp36-cp36m-manylinux1_x86_

Python 踩坑记 -- 调优

前言 继续解决问题 慢 一个服务运行有点慢,当然 Python 本身不快,如果再编码不当那这个可能就是量级上的劣化。 整个 Code 主线逻辑 1700+,各依赖封装 3000+,主线逻辑也是很久远的痕迹,长函数都很难看清楚一个 if else 的分支块到哪。 主线逻辑理清楚后,剔除其中诸多已失去意义的逻辑和无效操作,但是整体功能运行时常并未缩短,深入看下具体卡点原因。 调优肯定离不开 Pr

坑记(MySQL之delete操作)

背景知识 我们知道MySQL有两种删除操作:delete和truncate。 二者之间是否一样,且看以下内容: 操作名称操作简介deleteDML中的一种,操作对象是记录,即table中的一行,可恢复,速度慢truncateDDL中的一种,操作对象是表,即table本身,不可恢复,速度快 有了以上基本认识后,在使用过程中,可能会遇到什么情况呢? 情况说明 当你执行了一条delete语句,

CentOS安装Node.js以及JSDOM跳坑记

笔者在一台 CentOS 7.9 的服务器上使用常规的安装命令:sudo yum install node 来安装 Node.js,到最后系统提示: Error: Package: 2:nodejs-20.14.0-1nodesource.x86_64 (nodesource-nodejs)Requires: libstdc++.so.6(GLIBCXX_3.4.20)(64bit)You

druid使用入坑记(链接缓慢,hold问题)

在工作中,出现使用Druid链接Postgresql数据库,当第一次动态链接数据库源或者连过长时间不使用数据库时,出现链接过程缓慢,甚至hold的情况,链接时间以分计算,导致前端接口响应缓慢,影响用户操作问题。         经过日志的排查,发现是在DruidDataSource对象链接数据源过程中卡主了,并不是执行SQL语句查询慢的原因,通过网上查询资料,从一下几方面进行改进

Spark踩坑记——Spark Streaming+Kafka

前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从kafka中不断拉取数据进行词频统计。本文首先对spark streaming嵌入kafka的方式进行归纳总结,之后简单阐述Spark streaming+kafka在舆情项目中的应用,最后将自己在S

IDEA +Tomcat 新建 Spring MVC 项目踩坑记

前言 使用Java 做企业级Web开发,十多年前,SSH(Spring + Struts + Hibernate)框架很火,当时流行的 IDE 是 Eclipse 和 MyEclipse,后来过了几年变成了 SSM(Spring + Spring MVC + Mybatis),直到 2014 年 4 月,Spring 发布 Spring Boot 第一个正式版本后,后续新的微服务 web 项目基